Tr A
Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 11 Accepted Submission(s) : 7
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
Input
每組數據的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)兩個數據。接下來有n行,每行有n個數據,每個數據的範圍是[0,9],表示方陣A的內容。
Output
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
Source
HDU 2007-1 Programming Contest
矩陣乘法與快速冪模板
設A爲矩陣,則A^k可以化爲A^(k/2)*A^(k/2);k爲偶數,A^(k/2)*A^(k/2)*A,k爲奇數;
#include<stdio.h>
#include<string.h>
struct node
{
__int64 mat[15][15];
};//矩陣型結構體
__int64 n;
node mat_mat(node a,node b)//矩陣乘法
{
node c;
memset(c.mat,0,sizeof(c.mat));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
for(int k=1;k<=n;k++)
{
c.mat[i][j]+=a.mat[i][k]*b.mat[k][j];
c.mat[i][j]%=9973;
}
}
}
return c;
}
node pow(node a,__int64 nn)
{
node aa;
memset(aa.mat,0,sizeof(aa.mat));
for(int i=1;i<=n;i++)
aa.mat[i][i]=1;
while(nn)
{
if(nn&1)
aa=mat_mat(a,aa);
a=mat_mat(a,a);
nn>>=1;
}
return aa;
}
int main ()
{
node a,b;
__int64 i,j,sum,nn,t;
scanf("%I64d",&t);
while(t--)
{
scanf("%I64d%I64d",&n,&nn);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
scanf("%I64d",&a.mat[i][j]);
a.mat[i][j]%=9973;
}
b=pow(a,nn);
for(sum=0,i=1;i<=n;i++)
{
sum+=b.mat[i][i];
sum%=9973;
}
printf("%I64d\n",sum);
}
return 0;
}