又是一道矩阵快速幂
Tr A
Problem Description
A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求 T r ( A k ) % 9973 Tr(A^k)\%9973 Tr(Ak)%9973。
Input
数据的第一行是一个T,表示有T组数据。
每组数据的第一行有
n
(
2
<
=
n
<
=
10
)
n(2 <= n <= 10)
n(2<=n<=10)和
k
(
2
<
=
k
<
1
0
9
)
k(2 <= k < 10^9)
k(2<=k<109)两个数据。接下来有n行,每行有n个数据,每个数据的范围是[0,9],表示方阵A的内容。
Output
对应每组数据,输出T T r ( A k ) % 9973 Tr(A^k)\%9973 Tr(Ak)%9973。
Sample Input
2
2 2
1 0
0 1
3 99999999
1 2 3
4 5 6
7 8 9
Sample Output
2
2686
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 12; //矩阵的行列数
const int mod = 9973;
int n, k; //n行n列
struct mat {
int m[maxn][maxn];
mat() { //构造函数
memset(m,0,sizeof m);
for(int i=0;i<=n;++i)
m[i][i] = 1;
}
mat(int x) { //构造函数重载
memset(m,0,sizeof m);
}
int* operator[](int index) {
return m[index];
}
mat operator*(mat& a)
{
mat res(0);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j) {
for(int k=1;k<=n;++k)
res[i][j] += m[i][k]*a[k][j];
res[i][j] %= mod;
}
return res;
}
};
mat fastPow(mat a,int b)
{
mat res;
while(b)
{
if(b&1) res = res * a;
b >>= 1;
a = a*a;
}
return res;
}
int main()
{
int t;
cin >> t;
while(t--)
{
cin >> n >> k;
mat a(0);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
cin >> a[i][j];
mat res = fastPow(a,k);
int sum = 0;
for(int i=1;i<=n;++i) sum += res[i][i];
cout << sum % mod << endl;
}
return 0;
}
AC代码2:
#include <bits/stdc++.h>
using namespace std;
/**/
const int N = 15;
int n;
int mod;
/**/
struct mat{
int m[N][N];
mat(){
memset(m,0,sizeof(m));
for(int i=0;i<n;i++){
m[i][i]=1;
}
}
mat operator*(const mat& a){
mat res;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
res.m[i][j]=0;
for(int k=0;k<n;k++){
res.m[i][j] += m[i][k] * a.m[k][j];
}
res.m[i][j] %= mod;
}
}
return res;
}
};
mat fastpow(mat a,int n){
mat res;
while(n){
if(n&1) res = res*a;
n>>=1;
a=a*a;
}
return res;
}
int main()
{
mod=9973;
int T;
cin>>T;
int nn,kk;
while(T--){
cin>>nn>>kk;
n=nn;
mat a;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>a.m[i][j];
mat res = fastpow(a,kk);
int sum=0;
for(int i=0;i<n;i++){
sum+=res.m[i][i];
sum %= mod;
}
cout<<sum<<endl;
}
return 0;
}