Tr A
问题描述
A为一个方阵,则Tr
A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973。
输入
数据的第一行是一个T,表示有T组数据。
每组数据的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)两个数据。接下来有n行,每行有n个数据,每个数据的范围是[0,9],表示方阵A的内容。
每组数据的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)两个数据。接下来有n行,每行有n个数据,每个数据的范围是[0,9],表示方阵A的内容。
输出
对应每组数据,输出Tr(A^k)%9973。
输入样例
2
2 2
1 0
0 1
3 99999999
1 2 3
4 5 6
7 8 9
输出样例
2 2686
解释
裸的矩阵乘法+快速幂。。。
#include<cstdio> #include<cstring> using namespace std; int n,k,t,ans; int a[12][12],c[12][12],d[12][12]; int mi(int x){ memset(c,0,sizeof(c)); for(int i=1;i<=n;i++) c[i][i]=1; while(x>0){ if((x/2)*2!=x){ memset(d,0,sizeof(d)); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int h=1;h<=n;h++) d[i][j]+=((a[i][h]*c[h][j])%9973); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) c[i][j]=d[i][j]%9973; } x/=2; memset(d,0,sizeof(d)); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int h=1;h<=n;h++) d[i][j]+=((a[i][h]*a[h][j])%9973); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) a[i][j]=d[i][j]%9973; } int sum=0; for(int i=1;i<=n;i++) sum+=c[i][i]; sum%=9973; return sum; } int main() { scanf("%d",&t); for(int q=1;q<=t;q++){ scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&a[i][j]); ans=mi(k); printf("%d ",ans); } return 0; }