Time Limit: 1000MS | Memory Limit: 32768KB | 64bit IO Format: %I64d & %I64u |
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
Source
HDU 2007-1 Programming Contest
也是模板题 不过这个模板又和之前的有点不一样 用了重铸还是啥来着 完了名字了 不过就那个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);
}
}