1. 程式人生 > >11.05T4 矩陣操作

11.05T4 矩陣操作

3444 -- 【七夕模擬】⑨的故事

Description

  小L最喜歡⑨了。
  給定一個矩陣。你需要計算並輸出S=A^9*(A^1+A^2+…+A^k)
  由於數字太大,你只需要輸出S的每一項模2012的值就可以了
  給定一整數k<=10^8, 矩陣規模<=30*30

Input

  第一行2個整數N,K
  第二至第N+1行每行N個整數表示矩陣第i-1行的每一個元素

Output

  輸出如題目所示

Sample Input

1 1 1

Sample Output

1

Hint

【資料規模】
  50% k<=100
  100% k<=10^8, 矩陣規模<=30*30      

計算 S=A^1+A^2+...+A^k

令X=A^1+A^2+...+A^(k/2)

Ans=(A^(K/2)+E)*X

if K is奇數 then 快速冪quickpow(A^K)

else Ans

過載一下運算子要清楚一點

code:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 int n;
 6 const int mod=2012;
 7 struct matrix {
 8     int a[31][31];
 9     matrix() {
10         memset(a,0,sizeof a);
11     }
12
}; 13 matrix operator*(matrix a,matrix b) { 14 matrix c; 15 for(int i=1; i<=n; i++) 16 for(int j=1; j<=n; j++) 17 for(int k=1; k<=n; k++) 18 c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%mod; 19 return c; 20 } 21 matrix operator+(const matrix a,const matrix b) { 22 matrix c; 23 for(int i=1; i<=n; i++) 24 for(int j=1; j<=n; j++) 25 c.a[i][j]=(a.a[i][j]+b.a[i][j])%mod; 26 return c; 27 } 28 matrix operator^(matrix a,int b) { 29 matrix c; 30 for(int i=1; i<=n; i++)c.a[i][i]=1; 31 for(; b; b>>=1) { 32 if(b&1) { 33 c=c*a; 34 } 35 a=a*a; 36 } 37 return c; 38 } 39 matrix base; 40 matrix solve(int k) { 41 if(k==1)return base; 42 if(k%2==0){ 43 matrix l=solve(k/2); 44 matrix r=base^(k/2); 45 return (l*r)+l; 46 } 47 else{ 48 matrix l=solve(k/2); 49 matrix r=base^(k/2); 50 return ((l*r)+l)+(base^k); 51 } 52 } 53 int main() { 54 int k; 55 cin>>n>>k; 56 for(int i=1; i<=n; i++) { 57 for(int j=1; j<=n; j++) { 58 cin>>base.a[i][j]; 59 } 60 } 61 matrix other=base^9; 62 matrix r=solve(k); 63 other=other*r; 64 for(int i=1;i<=n;i++){ 65 for(int j=1;j<=n;j++){ 66 cout<<other.a[i][j]<<" "; 67 } 68 cout<<'\n'; 69 } 70 return 0; 71 }

over