1. 程式人生 > 其它 >【模板】矩陣快速冪

【模板】矩陣快速冪

矩陣快速冪與正常的整數快速冪完全一致,只不過重定義了一下乘號罷了。

但注意此程式碼下的ans應初始化為矩陣乘法的么元——即單位矩陣。

聯動#F.Tr A

#include<bits/stdc++.h>
using namespace std;
int n, moyn = 9973, t, s;
struct matrix{
	long long mat[10][10];
	matrix() {memset(mat,0,sizeof(mat));}
	matrix operator *(const matrix& T) const {
		matrix res;
		int tmp;
		for(int i = 0;i < 10;++i) {
			for(int k = 0;k < 10;++k) {
				tmp = mat[i][k];
				for(int j = 0;j < 10;++j) {
					res.mat[i][j] += tmp*T.mat[k][j];
					res.mat[i][j] %= moyn;
				}
			}
		}
		return res;
	}
} ans, base;
void init() {
	memset(ans.mat,0,sizeof(ans.mat));
	for(int i = 0;i < 10;++i)
		ans.mat[i][i] = 1;
	memset(base.mat,0,sizeof(base.mat));
	return;
}
void quickpow(int x) {
	while(x) {
		if(x&1) ans = ans*base;
		base = base*base;
		x >>= 1;
	}
	return;
}
int main() {
	scanf("%d",&t);
	for(int i = 1;i <= t;++i) {
		scanf("%d %d",&n,&s);
		init();
		for(int j = 0;j < n;++j)
			for(int k = 0;k < n;++k) 
				scanf("%lld",&base.mat[j][k]);
		quickpow(s);
		int res = 0;
		for(int i = 0;i < 10;++i) {
			res += ans.mat[i][i];
			res %= moyn;
		}
		printf("%d\n",res);
	}
	return 0;
}