HDU1575
题目解法:矩阵快速幂裸题:(附上其他快速*)
Code:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <math.h>
using namespace std;
const int mod=9973;
struct mx
{
int a[25][25];
};
int n,m,x,y,k,t;
int q_mul(int a,int b)//快速乘
{
int c=0;
while(b)
{
if(b&1)c=(c+a)%mod;
a=(a+a)%mod;
b>>=1;
}
return c;
}
int q_pow(int a,int b)快速幂
{
int c=1;
while(b)
{
if(b&1)c=q_mul(c,a)%mod;
a=q_mul(a,a)%mod;
b>>=1;
}
return c;
}
mx mxmul(mx a,mx b)矩阵乘
{
mx c;
memset(c.a,0,sizeof(c.a));
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
// for(int k=0;k<n;k++)//可以优化
// {
// c.a[i][j]+=(a.a[i][k]*b.a[k][j])%mod;
// c.a[i][j]%=mod;
// }
if(!a.a[i][j])continue;
for(int k=0;k<n;k++)
{
c.a[i][k]+=q_mul(a.a[i][j],b.a[j][k])%mod;
c.a[i][k]%=mod;
}
}
}
return c;
}
mx mxPow(mx a,int x)//矩阵快速幂
{
mx c;
memset(c.a,0,sizeof(c.a));
for(int i=0;i<n;i++)
c.a[i][i]=1;
while(x)
{
if(x&1)
c=mxmul(c,a);
a=mxmul(a,a);
x>>=1;
}
return c;
}
int main()
{
scanf("%d",&t);
while(t--)
{
mx a;
memset(a.a,0,sizeof(a.a));
scanf("%d%d",&n,&k);
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
scanf("%d",&a.a[i][j]);
}
}
a=mxPow(a,k);
int sum=0;
for(int i=0; i<n; i++)
{
(sum+=a.a[i][i])%=mod;
}
printf("%d\n",sum);
}
return 0;
}