题意:
给一个矩阵A和常数K,求一个C=A+A2+A3+。。。+AK
思路:
用矩阵的矩阵快速幂
|0 A| |1 0| |A A^2|
|0 0| |1 A| |0 0 |
还有牛顿迭代
A+A2+A3+A4+A5+A6 = A+A2+A3 + A3(A+A2+A3))
A+A2+A3+A4+A5+A6 +A7= A+A2+A3 + A4 +A4(A+A2+A3))
这个题和 Matrix Power Series poj3233 一样
这里给出矩阵套矩阵的代码
#include<stdio.h>
#include<string.h>
#define M 40
#define N 10
int n;
struct node
{
int a[M][M];
};
struct mmp
{
node a[4][4];
};
node cheng(node a,node b)
{
node 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]=(c.a[i][j]+(a.a[i][k]*b.a[k][j])%N)%N;
return c;
}
node jia(node a,node b)
{
node c;
memset(c.a,0,sizeof(c.a));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
c.a[i][j]=(c.a[i][j]+a.a[i][j]+b.a[i][j])%N;
return c;
}
node A,B;
void init()
{
memset(A.a,0,sizeof(A.a));
for(int i=0;i<M;i++)
A.a[i][i]=1;
memset(B.a,0,sizeof(B.a));
}
mmp chengmmp(mmp a,mmp b)
{
mmp c;
c.a[0][0]=c.a[0][1]=c.a[1][0]=c.a[1][1]=B;
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
c.a[i][j]=jia(c.a[i][j],cheng(a.a[i][k],b.a[k][j]));
return c;
}
void p(node a)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
printf("%d%c",(a.a[i][j]%N+N)%N," \n"[j==n-1]);
printf("\n");
}
int main()
{
int k,m;
node a;
mmp x,y;
init();
while(~ scanf("%d%d",&n,&m),n)
{
memset(a.a,0,sizeof(a));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
scanf("%d",&(a.a[i][j]));
a.a[i][j]%=N;
}
x.a[0][1]=a;
x.a[0][0]=x.a[1][0]=x.a[1][1]=B;
y.a[0][0]=y.a[1][0]=A;
y.a[1][1]=a;
y.a[0][1]=B;
while(m)
{
if(m&1) x=chengmmp(x,y);
y=chengmmp(y,y);
m>>=1;
}
p(x.a[0][0]);
}
return 0;
}