题目来源:http://poj.org/problem?id=3233
矩阵的快速幂。写完这份代码提交后Time Limit Exceeded,更改一小部分后,发现仍然是Time Limit Exceeded,然后无语了,
从网上看了一份代码,以为自己的二分递归还有运算符重载时间用的比较多(这个想法太天真了,哈哈),然后照着网上的代码重新
写了一份,重新提交仍然是Time Limit Exceeded,这就让我很无语了。后来发现是我数据类型设置有问题,long long数据格式运行
占用的时间稍长。改成int后AC
二分法:
幂
偶数:A^K=A^(K/2)*A^(K/2)
奇数:A^K=A^(K/2)*A^(K/2)*K
幂求和:
偶数:sum=A+A^2+...+A^K=(A+A^2+...+A^(K/2))*(1+A^(K/2))
奇数:sum=A+A^2+...+A^K=(A+A^2+...+A^(K/2+1))*(1+A^(K/2+1))+A^(K/2+1)
1 /*参考网上的代码*/ 2 #include<stdio.h> 3 const int maxn=35; 4 int n,k,mod; 5 struct matrix{ 6 int mat[maxn][maxn]; 7 }m,sum,unit; 8 matrix mul(matrix t1,matrix t2) 9 { 10 matrix temp; 11 for(int i=1;i<=n;i++) 12 for(int j=1;j<=n;j++){ 13 temp.mat[i][j]=0; 14 for(int k=1;k<=n;k++){ 15 temp.mat[i][j]+=t1.mat[i][k]*t2.mat[k][j]%mod; 16 temp.mat[i][j]%=mod; 17 } 18 } 19 return temp; 20 } 21 matrix add(matrix t1,matrix t2) 22 { 23 matrix temp; 24 for(int i=1;i<=n;i++) 25 for(int j=1;j<=n;j++) 26 temp.mat[i][j]=(t1.mat[i][j]+t2.mat[i][j])%mod; 27 return temp; 28 } 29 matrix binsearch(int k) 30 { 31 matrix ans,t; 32 ans=m; 33 t=unit; 34 while(k!=1){ 35 if(k&1){ 36 k--; 37 t=mul(ans,t); 38 } 39 else{ 40 k=k>>1; 41 ans=mul(ans,ans); 42 } 43 } 44 return mul(t,ans); 45 } 46 matrix matsum(int k) 47 { 48 matrix ans; 49 if(k==1) 50 ans=m; 51 else{ 52 matrix temp=matsum(k/2); 53 if(k&1){ 54 matrix binans=binsearch(k/2+1); 55 ans=add(temp,mul(temp,binans)); 56 ans=add(ans,binans); 57 } 58 else{ 59 ans=add(temp,mul(temp,binsearch(k/2))); 60 } 61 } 62 return ans; 63 } 64 int main() 65 { 66 scanf("%d%d%d",&n,&k,&mod); 67 for(int i=1;i<=n;i++) 68 for(int j=1;j<=n;j++){ 69 scanf("%d",&m.mat[i][j]); 70 unit.mat[i][j]=(i==j); 71 } 72 sum=matsum(k); 73 for(int i=1;i<=n;i++){ 74 for(int j=1;j<=n;j++) 75 printf("%d ",sum.mat[i][j]); 76 printf("\n"); 77 } 78 return 0; 79 }
1 #include<stdio.h> 2 const int maxn=35; 3 int n,k,mod; 4 struct matrix{ 5 int mat[maxn][maxn]; 6 matrix operator*(const matrix &t) 7 { 8 matrix temp; 9 for(int i=1;i<=n;i++) 10 for(int j=1;j<=n;j++){ 11 temp.mat[i][j]=0; 12 for(int k=1;k<=n;k++){ 13 temp.mat[i][j]+=mat[i][k]*t.mat[k][j]%mod; 14 temp.mat[i][j]%=mod; 15 } 16 } 17 return temp; 18 } 19 matrix operator+(const matrix &t) 20 { 21 matrix temp; 22 for(int i=1;i<=n;i++) 23 for(int j=1;j<=n;j++) 24 temp.mat[i][j]=(mat[i][j]+t.mat[i][j])%mod; 25 return temp; 26 } 27 }m,sum; 28 matrix binsearch(int k) 29 { 30 matrix ans; 31 if(k==1) 32 ans=m; 33 else{ 34 ans=binsearch(k/2); 35 ans=ans*ans; 36 if(k&1) 37 ans=ans*m; 38 } 39 return ans; 40 } 41 matrix matsum(int k) 42 { 43 matrix ans; 44 if(k==1) 45 ans=m; 46 else{ 47 matrix temp=matsum(k/2); 48 if(k&1){ 49 matrix binans=binsearch(k/2+1); 50 ans=temp+temp*binans+binans; 51 } 52 else{ 53 ans=temp+temp*binsearch(k/2); 54 } 55 } 56 return ans; 57 } 58 int main() 59 { 60 scanf("%d%d%d",&n,&k,&mod); 61 for(int i=1;i<=n;i++) 62 for(int j=1;j<=n;j++) 63 scanf("%d",&m.mat[i][j]); 64 sum=matsum(k); 65 for(int i=1;i<=n;i++){ 66 for(int j=1;j<=n;j++) 67 printf("%d ",sum.mat[i][j]); 68 printf("\n"); 69 } 70 return 0; 71 }