Test instructions: Give the n*k matrix A and K*n B, for (AB) ^ (n*n) result matrix of the sum of the elements of Module 6. (n<=1000,k<=6)
Idea: The matrix of a*b is the matrix of N*n (1000*1000), and then the fast power is definitely timed out, using multiplication to bind the law a^ (n*n) * b^ (n*n) = a*b*a*b*a*b*a = A * (b*a) * (b*a) • B*a 6* The matrix of 6 can be quickly power
62MS 1716K 1968 B C + + #include <cstdio> #include <iostream> #include <cstring> #include <algorithm >using namespace std;struct mat{int a[10][10]; int r,c; Mat () {memset (a,0,sizeof (a)); r=c=0; } void Mem () {memset (a,0,sizeof (a));}}; int N,l;mat i;int A[1010][10],b[10][1010];mat mul (Mat m1,mat m2) {mat ans; for (int i=1;i<=l;i++) for (int. j=1;j<=l;j++) if (M1.a[i][j]) for (int k=1;k<=l;k++) Ans.a[i][k]= (Ans.a[i][k]+m1.a[i][j]*m2.a[j][k])%6; return ans;} Mat Quickmul (Mat m,int k) {mat ans; for (int i=1;i<=l;i++) ans.a[i][i]=1; while (k) {if (k&1) Ans=mul (ans,m); M=mul (M,M); k>>=1; } return ans; int ans[1010][10];void ini () {memset (ans,0,sizeof (Ans)); I.mem ();} int main () {while (scanf ("%d%d", &n,&l), (n| | L)) {ini (); for (int i=1;i<=n;i++) for (int j=1;j<=l;j++) scanF ("%d", &a[i][j]); for (int i=1;i<=l;i++) for (int j=1;j<=n;j++) scanf ("%d", &b[i][j]); for (int i=1;i<=l;i++)//Calculate b*a matrix for (int j=1;j<=n;j++) if (B[i][j]) for (i NT k=1;k<=l;k++) i.a[i][k]= (i.a[i][k]+b[i][j]*a[j][k])%6; Mat Tmp=quickmul (i,n*n-1); for (int. i=1;i<=n;i++)//a* (b*a) ^ (n-1) for (int j=1;j<=l;j++) if (A[i][j]) for (int k=1;k<=l;k++) ans[i][k]= (ans[i][k]+a[i][j]*tmp.a[j][k])%6; int ans=0; for (int. i=1;i<=n;i++)//a* (b*a) ^ (n-1) ^b= (a*b) ^n for (int j=1;j<=n;j++) {int tmp = 0; for (int k=1;k<=l;k++) {tmp+=ans[i][k]*b[k][j]; } ans+= (tmp%6); } printf ("%d\n", ans); } return 0;}
HDU 4965 Fast matrix calculation (using matrix operation properties)