1113 矩陣快速冪
阿新 • • 發佈:2017-06-19
mes https clu %d long 其中 alt bsp spa
1113 矩陣快速冪
給出一個N * N的矩陣,其中的元素均為正整數。求這個矩陣的M次方。由於M次方的計算結果太大,只需要輸出每個元素Mod (10^9 + 7)的結果。 Input第1行:2個數N和M,中間用空格分隔。N為矩陣的大小,M為M次方。(2 <= N <= 100, 1 <= M <= 10^9) 第2 - N + 1行:每行N個數,對應N * N矩陣中的1行。(0 <= N[i] <= 10^9)Output
共N行,每行N個數,對應M次方Mod (10^9 + 7)的結果。Input示例
2 3 1 1 1 1Output示例
4 4 4 4
思路:模板
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int mod=1e9+7; 4 typedef long long ll; 5 int n,m; 6 struct prog 7 { 8 ll a[102][102]; 9 }; 10 prog s,B; 11 prog matrixmul(prog a,prog b) 12 { 13 prog c; 14 for(int i=1;i<=n;++i)for(int j=1;j<=n;++j) 15 { 16 c.a[i][j]=0; 17 for(int k=1;k<=n;k++) 18 c.a[i][j]+=(a.a[i][k]*b.a[k][j])%mod; 19 c.a[i][j]%=mod; 20 } 21 return c; 22 } 23 prog mul(prog s,int k) 24 { 25 prog ans; 26 for(int i=1;i<=n;++i)for(int j=1;j<=n;++j) ans.a[i][j]=(i==j)?1:0; 27 while(k){ 28 if(k&1) 29 ans=matrixmul(ans,s); 30 k>>=1; 31 s=matrixmul(s,s); 32 } 33 return ans; 34 } 35 36 int main(){ 37 scanf("%d%d",&n,&m); 38 prog s; 39 for(int i=1;i<=n;i++){ 40 for(int j=1;j<=n;j++) 41 scanf("%I64d",&s.a[i][j]); 42 } 43 s=mul(s,m); 44 for(int i=1;i<=n;i++){ 45 for(int j=1;j<=n;j++){ 46 printf("%I64d",(s.a[i][j]+mod)%mod); 47 if(j!=n) printf(" "); 48 } 49 printf("\n"); 50 } 51 }
1113 矩陣快速冪