//九度OJ 教程59 矩阵二分求幂法之大幂
2013-02-17 14:19
253 查看
//九度OJ 教程59 矩阵二分求幂法之大幂 //http://ac.jobdu.com/problem.php?cid=1040&pid=58 //大幂处理,二分求幂法,矩阵乘法 #include<stdio.h> #include<string.h> #define N 9973 typedef struct E{ int a[11][11]; int n; }E; E a,e;//e在main()函数里面被设置成了单位矩阵。 E mul(E x,E y)//矩阵x.a[][]与矩阵y.a[][]的乘积,每个元素对N取模 { int n=x.n,i,j,k; E z=e; z.n=x.n; for(i=0;i<n;i++) for(j=0;j<n;j++) { z.a[i][j]=0; for(k=0;k<n;k++)z.a[i][j]+=x.a[i][k]*y.a[k][j]%N; z.a[i][j]%=N; } return z; } E epow(E x,int k)//递归的二分求幂法。 { if(k==0)return e; if(k==1)return x; E z=e; z.n=x.n; z=epow(x,k>>1);//先求x的(k/2)次幂,存在z里面 z=mul(z,z);//然后自乘(即平方)。 if(k&1)z=mul(z,x);//如果k为奇数,再补上一次与矩阵x.a[][]的乘积。 return z; } int main() { int t,n,i,j,k,sum; E ans; for(i=0;i<11;i++)e.a[i][i]=ans.a[i][i]=1; scanf("%d",&t); while(t--) { sum=0; scanf("%d %d",&n,&k); a.n=ans.n=n; for(i=0;i<n;i++) for(j=0;j<n;j++)scanf("%d",&(a.a[i][j])); ans=epow(a,k); for(i=0;i<n;i++)sum=(sum+ans.a[i][i])%N; printf("%d\n",sum); } }
用重载运算符,又算了一遍,竟然忘记自乘了- -!
#include<stdio.h> #include<string.h> #define MAXS 10 #define MO 9973 typedef struct E{ int num[MAXS][MAXS]; int n; E operator * (E a) { E sum=a; int i,j,k; for(i=0;i<sum.n;i++) { for(j=0;j<sum.n;j++) { sum.num[i][j]=0; for(k=0;k<sum.n;k++)sum.num[i][j]+=num[i][k]*a.num[k][j]%MO; sum.num[i][j]%=MO; } } return sum; } }E; E e;//e在main里面被设置成单位矩阵 E fang(E a,int k) { if(k==0)return e; if(k==1)return a; E sum=fang(a,k>>1); sum=sum*sum;//别尼玛忘记自乘!!! if(k&1)sum=sum*a; return sum; } int main() { E a,b; int i,j,k,t,sum; memset(&e,0,sizeof(E)); for(i=0;i<MAXS;i++)e.num[i][i]=1; scanf("%d",&t); while(t--) { sum=0; scanf("%d %d",&e.n,&k); a.n=e.n; for(i=0;i<a.n;i++)for(j=0;j<a.n;j++)scanf("%d",&a.num[i][j]); b=fang(a,k); for(i=0;i<b.n;i++)sum+=b.num[i][i]; sum%=MO; printf("%d\n",sum); } return 0; }
相关文章推荐
- hdu 1005 Number Sequence(矩阵连乘+二分快速求幂)
- 九度oj1443 矩阵乘法加二分求幂
- hdu1575:Tr A_矩阵的幂&二分求幂
- POJ - 3233 Matrix Power Series (矩阵等比二分求和)
- hdu 1588 Gauss Fibonacci(矩阵乘法+二分)
- HDU 1507 1*2格子铺矩阵 二分匹配坐标点
- CF的LINSER啥啥的H(二分),G(换位置),C(博弈),D(前缀矩阵),B(寻找来的人)
- bzoj2738 矩阵乘法(整体二分+二维树状数组)
- 【大二最后一题】Wannafly模拟赛 矩阵【二分+二维字符串Hash】
- BZOJ 4443 [Scoi2015]小凸玩矩阵——二分+二分图匹配
- poj3233(快速求幂+二分)
- POJ - 3233 Matrix Power Series (矩阵等比二分求和)
- ACM学习历程—SNNUOJ1215 矩阵2(二分 && dfs)
- BZOJ 2738: 矩阵乘法 [整体二分]
- 上下火车【二分+矩阵快速幂】
- 算法复习___二分_矩阵连乘
- 九度oj-1391-顺时针打印矩阵
- [BZOJ]4443 [SCOI2015] 小凸玩矩阵 二分答案 + 二分图最大匹配
- bzoj4443: [Scoi2015]小凸玩矩阵(二分+二分图匹配)
- 九度OJ 教程99 动态规划之《搬寝室》