您的位置:首页 > 其它

poj 3233 Matrix Power Series(等比矩阵求和)

2014-08-08 15:38 393 查看
Description

Given a n × n matrix A and a positive integer k, find the sum
S = A + A2 + A3 + … +
Ak.

Input

The input contains exactly one test case. The first line of input contains three positive integers
n (n ≤ 30), k (k ≤ 109) and m (m < 104). Then follow
n lines each containing n nonnegative integers below 32,768, giving
A’s elements in row-major order.

Output

Output the elements of S modulo m in the same way as A is given.

Sample Input
2 2 4
0 1
1 1

Sample Output
1 2
2 3

代码:
#include<stdio.h>
#include<string.h>
int n,k,m;
const int maxn=31;
typedef struct
{
int  M[maxn][maxn];
void init()
{
memset(M,0,sizeof(M));
for(int i=0;i<maxn;i++)
M[i][i]=1;
}
}matrix;
matrix P;
matrix I;
matrix t=P,ans=I;
matrix mult(matrix a,matrix b)    //矩阵乘法
{
matrix c;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
c.M[i][j]=0;
for(int k=0;k<n;k++)
c.M[i][j]=(a.M[i][k]*b.M[k][j]+c.M[i][j])%m;
}
return c;
}
matrix pow_mod(matrix a,int n)   //矩阵快速幂
{
matrix b;
b.init();
while(n)
{
if(n&1)
b=mult(b,a);
n/=2;
a=mult(a,a);
}
return b;
}
matrix add(matrix a,matrix b)    //矩阵加法
{
matrix c;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
c.M[i][j]=(a.M[i][j]+b.M[i][j])%m;
return c;
}
matrix sum(matrix s,int k)      //二分求和   S=(1+A^(k/2))*((A+A^2+A^3+..A^K/2))
{
if(k==1)
return s;
matrix tmp;
tmp.init();
tmp=add(tmp,pow_mod(s,k/2));   //(1+A^(k/2))
tmp=mult(tmp,sum(s,k/2));     //(1+A^(k/2))*(A+A^2+A^3+..A^K/2)
if(k&1)
tmp=add(tmp,pow_mod(s,k));
return tmp;
}
int main()
{
while(scanf("%d %d %d",&n,&k,&m)!=EOF)
{
matrix s;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&s.M[i][j]);
s=sum(s,k);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(j)
printf(" ");
printf("%d",s.M[i][j]%m);
}
printf("\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: