11.05T4 矩陣操作
阿新 • • 發佈:2018-11-05
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
Sample Output
1Hint
【資料規模】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