Time Limit: 1000MS | Memory Limit: 32768KB | 64bit IO Format: %I64d & %I64u |
Description
Input
每組數據的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)兩個數據。接下來有n行,每行有n個數據,每個數據的範圍是[0,9],表示方陣A的內容。
Output
Sample Input
Sample Output
Source
也是模板題 不過這個模板又和之前的有點不一樣 用了重鑄還是啥來着 完了名字了 不過就那個operator*這裏不一樣 前面的是沒有這個的,把乘法運算符的意義給變了一下,不過其實本質上是一樣的,代碼如下:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int mod=9973;
int n,k;
struct Mat{
int a[14][14];
Mat()
{
memset(a,0,sizeof(a));
for(int i=1;i<=10;i++)
{
a[i][i]=1;
}
}
}base;
Mat operator*(Mat s,Mat b)
{
Mat r;
memset(r.a,0,sizeof(r.a));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
for(int p=1;p<=n;p++)
{
r.a[i][j]=r.a[i][j]+s.a[i][p]*b.a[p][j];
if(r.a[i][j]>mod)
r.a[i][j]=r.a[i][j]%mod;
}
}
}
return r;
}
void power(Mat &ans)
{
while(k)
{
if(k%2==1)
ans=base*ans;
base=base*base;
k=k/2;
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
Mat ans;
scanf("%d%d",&n,&k);
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
scanf("%d",&base.a[i][j]);
power(ans);
int sum=0;
for(int i=1; i<=n; i++)
{
sum+=ans.a[i][i];
if(sum>=mod)
sum%=mod;
}
printf("%d\n",sum);
}
}