裸题,求A^n次后的对角线数字之和

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<string.h>
 4 using namespace std;
 5 const int mod=9973;
 6 int n,m;
 7 struct node
 8 {
 9     int a[15][15];
10 }ans,base;
11 node mat(node x,node y)
12 {
13     node c;
14     for(int i=0;i<n;i++)
15     for(int j=0;j<n;j++){
16         c.a[i][j]=0;
17     }
18     for(int i=0;i<n;i++)
19     for(int j=0;j<n;j++)
20     for(int k=0;k<n;k++){
21         c.a[i][j]=(c.a[i][j]+x.a[i][k]*y.a[k][j]%mod)%mod;
22     }
23     return c;
24 }
25 node quick_mod()
26 {
27     node tmp;
28     for(int i=0;i<=n;i++)
29     for(int j=0;j<=n;j++){
30         if(i==j) tmp.a[i][j]=1;
31         else tmp.a[i][j]=0;
32     }
33     while(m){
34         if(m&1) tmp=mat(tmp,base);
35         base=mat(base,base);
36         m>>=1;
37     }
38     return tmp;
39 }
40 int main()
41 {
42     int T;
43     scanf("%d",&T);
44     while(T--){
45         scanf("%d%d",&n,&m);
46         for(int i=0;i<n;i++)
47         for(int j=0;j<n;j++){
48             scanf("%d",&base.a[i][j]);
49         }
50         ans=quick_mod();
51         int tmp=0;
52         for(int i=0;i<n;i++)
53             tmp=(tmp+ans.a[i][i])%mod;
54         printf("%d\n",tmp);
55     }
56     return 0;
57 }