首页 > 代码库 > hdu 4965 Fast Matrix Calculation
hdu 4965 Fast Matrix Calculation
直接按照题目上的做 A*B 形成一个N*N的矩阵C,再用C求其n*n次幂。这样果断超时啊。
看了题解(AB)^n 可以写成 A (BA)^(n-1) B , B*A 形成的矩阵就是K*K的,这里果断省了一大把时间啊,这么简单的变换为毛我们就是没想到 TAT
1 #include<iostream> 2 #include<cstdio> 3 #include<map> 4 #include<algorithm> 5 #include<cstring> 6 #define INF 9999999 7 using namespace std; 8 struct node 9 {10 int mat[1002][7];11 } a,b,c;12 13 14 node mul(node a,node b,int n,int m,int p)15 {16 node c;17 memset(c.mat,0,sizeof(c.mat));18 for(int i=0; i<n; i++)19 for(int j=0; j<m; j++)20 if(a.mat[i][j])21 {22 for(int k=0; k<p; k++)23 c.mat[i][k]=(c.mat[i][k]+a.mat[i][j]*b.mat[j][k])%6;24 }25 return c;26 }27 28 node solve(node a,int num,int n)29 {30 node b;31 memset(b.mat,0,sizeof(b.mat));32 for(int i=0; i<n; i++)33 b.mat[i][i]=1;34 while(num)35 {36 if(num%2)37 b=mul(b,a,n,n,n);38 a=mul(a,a,n,n,n);39 num/=2;40 }41 return b;42 }43 44 int main()45 {46 int n,m;47 while(~scanf("%d%d",&n,&m))48 {49 if(n==0&&m==0)50 break;51 for(int i=0; i<n; i++)52 for(int j=0; j<m; j++)53 scanf("%d",&a.mat[i][j]);54 55 for(int i=0; i<m; i++)56 for(int j=0; j<n; j++)57 scanf("%d",&b.mat[i][j]);58 59 if(n==1)60 c=mul(a,b,n,m,m);61 else62 {63 c=mul(b,a,m,n,m);64 c=solve(c,n*n-1,m);65 66 c=mul(c,b,n,m,n);67 c=mul(a,c,n,m,n);68 69 }70 int ans=0;71 for(int i=0; i<n; i++)72 for(int j=0; j<n; j++)73 ans+=c.mat[i][j];74 printf("%d\n",ans);75 }76 return 0;77 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。