hdu 1575 Tr A(矩阵快速幂)
今天做的第二道矩阵快速幂题,因为是初次接触,各种奇葩错误整整调试了一下午。废话不说,入正题。该题应该属于矩阵快速幂的裸题了吧,知道快速幂原理(二进制迭代法,非递归版)后,剩下的只是处理矩阵乘法的功夫了,我直接用个结构体来表示矩阵,确实能省去不少功夫(这里一定要注意用单位矩阵来初次相乘,但不要把它放进构造函数中,我就是在这里卡了好久)。下面附上代码:
1 #include<cstdio>
2 #include<cstring>
3 const int Mod= 9973;
4
5 struct matrix{
6 int a[12][12], n;
7 matrix(int _n){
8 n =_n;
9 memset(a,0,sizeof(a));
10 }
11 void identity(){
12 for(int i=1; i<=n; ++i) //单位矩阵的初始化,切记!
13 a[i][i]= 1; //如果没有这个的话就不能直接相乘了
14 }
15 matrix operator *(const matrix m2){
16 matrix mul(this->n);
17 for(int i=1; i<=n; ++i)
18 for(int j=1; j<=n; ++j)
19 for(int k=1; k<=n; ++k)
20 mul.a[i][j]= (mul.a[i][j]+ this->a[i][k]*m2.a[k][j]%Mod)% Mod;
21 return mul;
22 }
23 };
24
25 matrix quick_mod(matrix &m, int p)
26 {
27 matrix ans(m.n);
28 ans.identity(); // ans一定要为单位矩阵的!
29 while(p){
30 if(p&1) ans= ans*m;
31 m= m*m;
32 p>>=1;
33 }
34 return ans;
35 }
36
37 int main()
38 {
39 int t,n,k,i,j;
40 scanf("%d",&t);
41 while(t--){
42 scanf("%d%d",&n,&k);
43 matrix m(n);
44 for(i=1; i<=n; ++i)
45 for(j=1; j<=n; ++j)
46 scanf("%d",&m.a[i][j]);
47 matrix ans(n);
48 ans= quick_mod(m,k);
49 int sum= 0;
50 for(i=1; i<=n; ++i)
51 sum= (sum+ ans.a[i][i])%Mod;
52 printf("%d\n",sum);
53 }
54 return 0;
55 }