1. 程式人生 > >1113 矩陣快速冪

1113 矩陣快速冪

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 1
Output示例
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 矩陣快速冪