Tr ATime Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7362 Accepted Submission(s): 5404 Problem Description A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973。
Input 数据的第一行是一个T,表示有T组数据。
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
Author xhd
Source |
1.题目含义:已经知道矩阵A ,现在要求A^k矩阵对角线上的和,且取余9973
2.题目分析:就是裸矩快速幂提题,有两个重点,一是矩阵相乘,二是快速幂。
2.1 矩阵相乘(原则:只有当A矩阵的行数等于B矩阵的列数的时候,才可以做乘法运算。)
A(的列)*B(的行)
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
for(int k=0;k<n;k++)
{
ab[i][j]=(ab[i][j]+a[i][k]*b[k][j])%mod;
}
}
}
2.2快速幂部分:
while(k)
{
if(k&1) cheng(center,a);
k=k/2;
cheng(a,a);
}
3.代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
#define mod 9973
int t,n,k;
int num[11][11];
void cheng(int a[][11],int b[][11])
{
int ab[11][11];
memset(ab,0,sizeof(ab));
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
for(int k=0;k<n;k++)
{
ab[i][j]=(ab[i][j]+a[i][k]*b[k][j])%mod;
}
}
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j]=ab[i][j];
}
void kusumi(int a[][11])
{
int center[11][11];
for(int i=0;i<11;i++)
{
for(int j=0;j<11;j++)
{
if(i==j) center[i][j]=1;
else center[i][j]=0;
}
}
while(k)
{
if(k&1) cheng(center,a);
k=k/2;
cheng(a,a);
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
a[i][j]=center[i][j];
}
int main()
{
cin>>t;
while(t--)
{
cin>>n>>k;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>num[i][j];
kusumi(num);
int ans=0;
for(int i=0;i<n;i++)
ans=(ans+num[i][i])%mod;
cout<<ans<<endl;
}
return 0;
}