矩阵快速幂<求有向图路径为k的方案(每条边可以取多次)>
来源:互联网 发布:python 金融数据 编辑:程序博客网 时间:2024/06/10 21:37
刚开始把建立一个矩阵,用以表示任意两个顶点之间是否有边,如果有矩阵上就为1,反之为0。
那么此时如果 这个矩阵乘这个矩阵,意思就成了这个矩阵u到w长度为1的个数乘上w到v长度为1的个数,也就成了长度为2的个数的多少(边取得任意多次)。
此时得到的k=2的矩阵,这个矩阵乘长度为1的矩阵还是这个矩阵u到w长度为2的个数乘上w到v长度为1的个数,也就是长度为3的矩阵个数
这么乘可以用快速幂求出。
#include <iostream>#include <string.h>#include <stdio.h>using namespace std;const int MOD=1e4+7;struct ttt{ int map1[20][20];};int n;ttt mul(ttt &a,ttt &b){ //矩阵A*B ttt c; int i,j,k; for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ c.map1[i][j]=0; for(k=1;k<=n;k++){ c.map1[i][j]+=a.map1[i][k]*b.map1[k][j]; c.map1[i][j]%=MOD; } } } return c;}ttt mul_self(ttt &a){ ttt b; int i,j,k; for(i=1;i<=n;i++) for(j=1;j<=n;j++){ b.map1[i][j]=0; for(k=1;k<=n;k++){ b.map1[i][j]+=a.map1[i][k]*a.map1[k][j]; b.map1[i][j]%=MOD; } } return b;}ttt pow1(ttt &a,int k){ ttt b; int i,j; memset(b.map1,0,sizeof(b.map1)); for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i==j) b.map1[i][j]=1; while(k){ //cout << "k=" <<k <<endl; if(k&1) b=mul(b,a); k=k>>1; a=mul_self(a); } return b;}int main(){ freopen("in.txt","r",stdin); int i,j,k,l,f1,f2,f3,t1,t2,t3; int r,c,m; int a1,b1,c1; int T; ttt a; memset(a.map1,0,sizeof(a.map1)); cin >> n >> m;//n个结点,m条边 for(i=1;i<=m;i++){ cin >>t1>> t2; a.map1[t1][t2]=1; } a=pow1(a,2); int sum1=0; for(i=1;i<=n;i++) for(j=1;j<=n;j++){ sum1+=a.map1[i][j]; } cout << sum1 << endl; return 0;}
A sequence of integers x1, x2, ..., xk is called a "xor-sequence" if for every 1 ≤ i ≤ k - 1 the number of ones in the binary representation of the number xi
![](http://codeforces.com/predownloaded/c1/5d/c15d2b716fe31376e2f869457fe96754821bf274.png)
![](http://codeforces.com/predownloaded/87/3b/873bfd9b14949e68c62e8e9c808646fcb76ab992.png)
![](http://codeforces.com/predownloaded/c1/5d/c15d2b716fe31376e2f869457fe96754821bf274.png)
wa了 long long是种玄学,tle有可能long long 导致
题意:把一个序列的整数if这些整数异或以后的the number of ones是3的倍数 ,这里这个集合是指可以重复选择,x1,x2,x3叫做xor序列,问最大序列长度为k 的结果
这个关系可以两两建立一个图,无向图(相当于有向图箭头2边都有),然后找长度为k-1的路径,也就是结点数为k
矩阵快速幂即可。
#include <iostream>#include <string.h>#include <stdio.h>using namespace std;const int MOD=1e9+7;typedef long long ll;struct ttt{ ll map1[120][120];};ll n;ttt mul(ttt &a,ttt &b){ //矩阵A*B ttt c; ll i,j,k; for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ c.map1[i][j]=0; for(k=1;k<=n;k++){ c.map1[i][j]=(c.map1[i][j]+a.map1[i][k]*b.map1[k][j])%MOD; } } } return c;}ttt mul_self(ttt &a){ ttt b; ll i,j,k; for(i=1;i<=n;i++) for(j=1;j<=n;j++){ b.map1[i][j]=0; for(k=1;k<=n;k++){ b.map1[i][j]=(b.map1[i][j]+a.map1[i][k]*a.map1[k][j])%MOD; } } return b;}ttt pow1(ttt &a,ll k){ ttt b; ll i,j; memset(b.map1,0,sizeof(b.map1)); for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i==j) b.map1[i][j]=1; while(k){ //cout << "k=" <<k <<endl; if(k&1) b=mul(b,a); k=k>>1; a=mul_self(a); } return b;}ll qq[105];ll fun2(ll x){ ll t1=0; while(x){ if(x%2==1)t1++; x/=2; } if(t1%3==0)return 1; else return 0;}int main(){ // freopen("in.txt","r",stdin); ll i,j,k,l,f1,f2,f3,t1,t2,t3; ll r,c,m; ll a1,b1,c1; ll T; ttt a; memset(a.map1,0,sizeof(a.map1)); cin >> n >> m;//n个结点,m条边 for(i=1;i<=n;i++){ cin >> qq[i]; } if(m==1){ cout << n<< endl;return 0; } for(i=1;i<=n;i++) for(j=1;j<=n;j++){ if(fun2(qq[i]^qq[j])==1) a.map1[i][j]=1; } a=pow1(a,m-1); long long sum1=0; for(i=1;i<=n;i++) for(j=1;j<=n;j++){ sum1+=a.map1[i][j]; sum1%=MOD; } cout << sum1 << endl; return 0;}
阅读全文
0 0
- 矩阵快速幂<求有向图路径为k的方案(每条边可以取多次)>
- POJ 3613 快速幂+Floyd变形(求限制k条路径的最短路)
- hdoj 2157 How many ways?? 【矩阵快速幂】【求任意两点间的路径上 经过k个点的方案数】
- 给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数---矩阵乘法
- 快速矩阵幂-有向图
- HDU 2157 How many ways?? 矩阵快速幂求A经过K个点到B方案数
- 矩阵图求路径条数问题(简单dp)
- 矩阵快速幂模板(可以在二重循环或者三重循环的地方取模)
- The Shortest Path(矩阵快速幂构造有向图+floyed算法求图多源最短路)
- 长度为n的数组,取其中k个,要求和为sum,求有多少种取法
- 求矩阵的快速幂
- 求矩阵的快速幂
- POJ3613 经过K条边的最短路径 矩阵乘法 + floyd
- 求每行每列都有序的一个矩阵的第k大的值
- 求每分组取前3条纪录的sql语句
- HDU 4602 Partition 组成n的方案中k有几个 (好题!!!!找规律题+快速幂)
- HDU 5607 求A到B走K步的概率 矩阵快速幂DP
- 动态规划求有向无环图的最短路径
- sed
- 【OpenCV】图像缩放
- Spring注入@Autowired和@Resource
- 欢迎使用CSDN-markdown编辑器
- Vivado Synthesis中如何为Verilog代码中的“include file”设置路径?
- 矩阵快速幂<求有向图路径为k的方案(每条边可以取多次)>
- 属性图和ASCII,找了很久,放起来随时用
- liunx 添加tomcat 开机启动
- 范型编程
- 变参日志函数
- 使用 IP example design
- Android多媒体--MediaCodec api
- 实现桌面应用图标的动态隐藏和显示,触发事件为SIM卡的状态
- 记得在执行循环命令时,一定要用unset()清内存,不然你的内存会不够用的!