二分法+快速幂POJ 3233

来源:互联网 发布:python 人工智能 开发 编辑:程序博客网 时间:2024/04/29 13:55
#include <stdio.h>
#include <string.h>
long long q;
int n,m;
struct xxx
{
long long p[35][35];
}sum,x,e,s;
xxx ddd(xxx a,xxx b) //矩阵相乘
{
int i,j,k;
xxx ans;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
ans.p[i][j]=0;
for(k=0;k<n;k++)
ans.p[i][j]+=a.p[i][k]*b.p[k][j];
}
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
ans.p[i][j]=ans.p[i][j]%m;
return ans;
}
xxx add(xxx a,xxx b) //矩阵相加
{
int i,j;
xxx ans;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
ans.p[i][j]=(a.p[i][j]+b.p[i][j])%m;
return ans;
}
xxx solve(long long q)
{
int i,j;
if(q==1)
return x;
if(q%2==0) //幂为偶数
{
xxx temp;
temp=solve(q/2);
sum=ddd(sum,add(temp,e));
x=ddd(x,x);
return x;
}
else //幂为奇数
{
xxx temp;
temp=solve(q/2);
sum=ddd(sum,add(temp,e));
temp=ddd(temp,temp);
temp=ddd(temp,s);
sum=add(sum,temp);
x=temp;
return x;
}
}
int main()
{
int i,j,k;
while(scanf("%d%I64d%d",&n,&q,&m)!=-1)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%I64d",&x.p[i][j]);
sum=x;
s=x;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i==j)
e.p[i][j]=1;
else
e.p[i][j]=0;
}
}
x=solve(q);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(j==0)
printf("%I64d",sum.p[i][j]);
else
printf(" %I64d",sum.p[i][j]);
}
printf("\n");
}
}
return 0;
}
0 0
原创粉丝点击