今天做的第二道矩陣快速冪題,因爲是初次接觸,各種奇葩錯誤整整調試了一下午。廢話不說,入正題。該題應該屬於矩陣快速冪的裸題了吧,知道快速冪原理(二進制迭代法,非遞歸版)後,剩下的只是處理矩陣乘法的功夫了,我直接用個結構體來表示矩陣,確實能省去不少功夫(這裏一定要注意用單位矩陣來初次相乘,但不要把它放進構造函數中,我就是在這裏卡了好久)。下面附上代碼:
#include<cstdio>
#include<cstring>
const int Mod= 9973;
struct matrix{
int a[12][12], n;
matrix(int _n){
n =_n;
memset(a,0,sizeof(a));
}
void identity(){
for(int i=1; i<=n; ++i) //單位矩陣的初始化,切記!
a[i][i]= 1; //如果沒有這個的話就不能直接相乘了
}
matrix operator *(const matrix m2){
matrix mul(this->n);
for(int i=1; i<=n; ++i)
for(int j=1; j<=n; ++j)
for(int k=1; k<=n; ++k)
mul.a[i][j]= (mul.a[i][j]+ this->a[i][k]*m2.a[k][j]%Mod)% Mod;
return mul;
}
};
matrix quick_mod(matrix &m, int p)
{
matrix ans(m.n);
ans.identity(); // ans一定要爲單位矩陣的!
while(p){
if(p&1) ans= ans*m;
m= m*m;
p>>=1;
}
return ans;
}
int main()
{
int t,n,k,i,j;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&k);
matrix m(n);
for(i=1; i<=n; ++i)
for(j=1; j<=n; ++j)
scanf("%d",&m.a[i][j]);
matrix ans(n);
ans= quick_mod(m,k);
int sum= 0;
for(i=1; i<=n; ++i)
sum= (sum+ ans.a[i][i])%Mod;
printf("%d\n",sum);
}
return 0;
}