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

posted @ 2018-11-05 21:59  saionjisekai  阅读(228)  评论(0编辑  收藏  举报