您的位置:首页 > 其它

矩阵快速幂

2015-06-21 16:08 549 查看
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1113

这个题因为m比较大,所以不能递归求解,需要换成循环的形式.

#include <cstdio>
typedef long long ll;
const int mod = 1e9+7;
struct Mat
{
ll matrix[100][100];
};

int n,m;

Mat mul(Mat a,Mat b)
{
Mat c;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
c.matrix[i][j]=0;
for(int k=0;k<n;k++)
{
c.matrix[i][j]+=(a.matrix[i][k]*b.matrix[k][j])%mod;
}
c.matrix[i][j]%=mod;
}
return c;
}
Mat mat;
Mat solve(int m)
{
Mat mt=mat;
m--;
while(m)
{
if(m&1)
{
mt=mul(mat,mt);
m--;
}
mat=mul(mat,mat);
m/=2;
}
return mt;
}
int main()
{
//freopen("a.txt","r",stdin);
int x;
Mat a,b,c;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
scanf("%d",&x);
a.matrix[i][j]=x;
}
mat=a;
/*for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
printf("%d ",mt.matrix[i][j]);
printf("\n");
}*/
c=solve(m);
for(int i=0;i<n;i++)
{
for(int j=0;j<n-1;j++) printf("%lld ",c.matrix[i][j]);
printf("%lld\n",c.matrix[i][n-1]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: