Tr A hdu1575
就是一个快速幂的应用:
只要知道怎么求矩阵相乘!!(比赛就知道会超时,就是没想到快速幂!!!)
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<algorithm> 5 using namespace std; 6 __int64 a[15][15],b[15][15],c[15][15]; 7 int n; 8 int main() 9 { 10 int t,i,j,m,k,d; 11 __int64 sum; 12 scanf("%d",&t); 13 while(t--) 14 { 15 scanf("%d%d",&n,&m); 16 for(i=0;i<n;i++) 17 for(j=0;j<n;j++) 18 {scanf("%I64d",&a[i][j]);b[i][j]=a[i][j];} 19 d=0; 20 while(m) 21 { 22 if(m%2&&d==0)//因为快速幂规定起始为1,则第一次就来要分开考虑!! 23 { 24 for(i=0;i<n;i++) 25 for(j=0;j<n;j++) 26 a[i][j]=b[i][j]; 27 d=1; 28 } 29 else if(m%2) 30 { 31 memset(c,0,sizeof(c)); 32 for(i=0;i<n;i++) 33 for(j=0;j<n;j++) 34 for(k=0;k<n;k++) 35 c[i][j]+=a[i][k]*b[k][j]%9973; 36 for(i=0;i<n;i++) 37 for(j=0;j<n;j++) 38 a[i][j]=c[i][j]; 39 } 40 m=m/2; 41 memset(c,0,sizeof(c)); 42 for(i=0;i<n;i++) 43 for(j=0;j<n;j++) 44 for(k=0;k<n;k++) 45 c[i][j]+=b[i][k]*b[k][j]%9973; 46 for(i=0;i<n;i++) 47 for(j=0;j<n;j++) 48 b[i][j]=c[i][j]; 49 } 50 sum=0; 51 for(i=0;i<n;i++) 52 sum+=a[i][i]; 53 printf("%I64d ",sum%9973); 54 } 55 return 0; 56 }
附上快速幂的模板:
1 __int64 power(__int64 p,__int64 n) //反复平方法求(p^n)%mod 2 { 3 __int64 sq=1; 4 while(n>0) 5 { 6 if(n%2) 7 sq=(sq*p)%mod; 8 n/=2; 9 p=p*p%mod; 10 } 11 return sq; 12 }