自从学长教了我学了矩阵乘法后,感觉自信多了,学到了一点东西就是好!下面是个矩阵乘法,接着上一题的学习,就刷了一下这个题目!其实矩阵乘法快速幂不难。就是
把矩阵也看成一个数!
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
const int maxn=15;//一开始数组开小了,WA了两次
int n,k1,t;
struct matrix
{
__int64 arr[maxn][maxn];
} p1,p2;
void init()
{
scanf("%d%d",&n,&k1);
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
scanf("%I64d",&p1.arr[i][j]);//这里也糊涂了一下,输入出了一点问题,WA一次
}
}
memset(p2.arr,0,sizeof(p2.arr));
for(int i=0; i<n; i++)
{
p2.arr[i][i]=1;
}
}
void mod(matrix &k)
{
for(int i=0; i<n; i++)
{
for(int j=0; j<=n; j++)
{
k.arr[i][j]%= 9973;
}
}
}
matrix multiply(matrix x,matrix y)
{
matrix temp;
memset(temp.arr,0,sizeof(temp.arr));
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
for(int k=0; k<n; k++)
{
temp.arr[i][j]+=x.arr[i][k]*y.arr[k][j];
}
}
}
return temp;
}
matrix cal(matrix a,int n,matrix k)
{
mod(a);
while(n>=1)
{
if((n&1)!=0)
{
k=multiply(a,k);
mod(k);
}
n>>=1;
a=multiply(a,a);
mod(a);
}
return k;
}
int main()
{
while(scanf("%d",&t)!=EOF)
{
while(t--)
{
init();
matrix p3;
memset(p3.arr,0,sizeof(p3.arr));
p3=cal(p1,k1,p2);
__int64 sum;
sum=0;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(i==j)
{
sum+=p3.arr[i][j];
sum%=9973;
}
}
}
printf("%I64d\n",sum);
}
}
return 0;
}