Tr A
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1783 Accepted Submission(s): 1313
Problem Description
A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973。
Input
数据的第一行是一个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的内容。
Output
对应每组数据,输出Tr(A^k)%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
//简单的矩阵的快速幂,注意不能是中间过程溢出
#include<iostream>
#include<cstring>
using namespace std;
const int mod=9973;
int n,k;
struct node
{
__int64 a[10][10];
}res,origin;
void init()
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
res.a[i][j]=0;
scanf("%I64d",&origin.a[i][j]);
if(i==j)
res.a[i][j]=1;
}
}
}
node Mitix(node aa,node bb)
{
node temp;
int i,j,t;
memset(temp.a,0,sizeof(temp.a));
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
for(t=0;t<n;t++)
{
temp.a[i][j]=(temp.a[i][j]+aa.a[i][t]*bb.a[t][j])%mod;
}
}
}
return temp;
}
__int64 cal()
{
int i;
int m=k;
while(m)
{
if(m&1)
res=Mitix(res,origin);
m=m>>1;
origin=Mitix(origin,origin);
}
__int64 temp=0;
for(i=0;i<n;i++)
{
temp=(temp+res.a[i][i])%mod;
}
return temp;
}
int main()
{
int t;
cin>>t;
while(t--)
{
scanf("%d%d",&n,&k);
init();
__int64 ans=cal();
printf("%I64d\n",ans);
}
return 0;
}