POJ3233 Matrix Power Series 矩阵乘法
http://poj.org/problem?id=3233
挺有意思的..学习到结构体作为变量的转移,
题意 : 给定矩阵A,求A + A^2 + A^3 + ... + A^k的结果(两个矩阵相加就是对应位置分别相加)。输出的数据mod m。k<=10^9。
代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<cmath> 6 #include<queue> 7 using namespace std; 8 const int maxn=10010; 9 const double eps=1e-8; 10 int n,m; 11 struct mat{ 12 int e[35][35]; 13 }; 14 mat plu(mat x,mat y){//相加 15 for(int i=1;i<=n;i++){ 16 for(int j=1;j<=n;j++){ 17 x.e[i][j]+=y.e[i][j]; 18 x.e[i][j]%=m; 19 } 20 }return x; 21 } 22 mat pro(mat x,mat y){//相乘 23 mat z; 24 for(int i=1;i<=n;i++){ 25 for(int j=1;j<=n;j++){ 26 z.e[i][j]=0; 27 for(int k=1;k<=n;k++){ 28 z.e[i][j]+=x.e[i][k]*y.e[k][j]; 29 z.e[i][j]%=m; 30 } 31 } 32 }return z; 33 } 34 mat pow(mat x,int k){//次方 35 mat z; 36 if(k==1){ 37 return x; 38 } 39 if(k%2==0){ 40 z=pow(pro(x,x),k/2); 41 return z; 42 }else{ 43 z=pow(pro(x,x),k/2); 44 return pro(z,x); 45 } 46 } 47 mat doit(mat x,int k){//相加 48 if(k==1){ 49 return x; 50 } 51 if(k%2==0){ 52 mat z; 53 z=doit(x,k/2); 54 return plu(z,pro(z,pow(x,k/2))); 55 }else{ 56 mat z,z1; 57 z=doit(x,k/2); 58 z1=pow(x,k/2); 59 return plu(plu(z,pro(z,z1)),pro(pro(z1,z1),x)); 60 } 61 } 62 int main(){ 63 int k; 64 mat a; 65 scanf("%d%d%d",&n,&k,&m); 66 for(int i=1;i<=n;i++){ 67 for(int j=1;j<=n;j++){ 68 scanf("%d",&a.e[i][j]); 69 a.e[i][j]%=m; 70 } 71 } 72 mat ans=doit(a,k); 73 for(int i=1;i<=n;i++){ 74 for(int j=1;j<=n;j++){ 75 ans.e[i][j]%=m; 76 printf("%d ",ans.e[i][j]); 77 } 78 cout<<endl; 79 } 80 return 0; 81 }