http://acm.hdu.edu.cn/showproblem.php?pid=1575
二维矩阵做参数,写在结构体里,优化;
#include <stdio.h>
#include <string.h>
struct Matrix
{
int m[12][12];
}a,b,c;
int n,m,i,j,k;
Matrix deal(Matrix a,Matrix b) //基本的矩阵乘法
{
Matrix c;
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
c.m[i][j]=0;
for (k=0;k<n;k++)
{
c.m[i][j]+=a.m[i][k]*b.m[k][j];
}
c.m[i][j]%=9973;
}
}
return c;
}
Matrix pow(Matrix a,Matrix b) //二分法求阶乘
{
while (m!=0)
{
if (m%2==1)
{
b=deal(a,b);
}
m/=2;
a=deal(a,a);
}
return b;
}
int main()
{//freopen("D:\\1.txt","r",stdin);
int t;
while (scanf("%d",&t)!=EOF)
{
while (t--)
{
scanf("%d%d",&n,&m); //n阶矩阵,m次方
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
scanf("%d",&a.m[i][j]); //a是目标矩阵
if (i==j)
{
b.m[i][j]=1; //b是单位矩阵
}
else
b.m[i][j]=0;
}
}
c=pow(a,b);
int ans=0;
for (i=0;i<n;i++)
{
ans+=c.m[i][i];
}
printf("%d\n",ans%9973);
}
}
return 0;
}