hdu1575 Tr A(矩陣快速冪)

今天做的第二道矩陣快速冪題,因爲是初次接觸,各種奇葩錯誤整整調試了一下午。廢話不說,入正題。該題應該屬於矩陣快速冪的裸題了吧,知道快速冪原理(二進制迭代法,非遞歸版)後,剩下的只是處理矩陣乘法的功夫了,我直接用個結構體來表示矩陣,確實能省去不少功夫(這裏一定要注意用單位矩陣來初次相乘,但不要把它放進構造函數中,我就是在這裏卡了好久哭)。下面附上代碼:

#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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章