poj 3233 Matrix Power Series

来源:互联网 发布:php url传递参数 编辑:程序博客网 时间:2024/04/30 02:18

还是矩阵的快速幂。。。

只要令Sk=I+A+A^2+.....A^(k-1)

 

则有   Ak  =  |  A  0  |    Ak-1  =  | A 0 | ^ k   |

          Sk      |  I    I   |    Sk-1      | I  I  |        0

其中I是单位矩阵

最后矩阵的左下角的那个小矩阵就是要求的(只不过要减去一个单位矩阵)

#include<stdio.h>struct node{int c[70][70];}FAB;int n,m,k;struct node B;struct node mul(struct node *a,struct node *b){struct node t;int i,j,k;for(i=0;i<2*n;i++)for(j=0;j<2*n;j++)t.c[i][j]=0;for(i=0;i<2*n;i++)for(j=0;j<2*n;j++)for(k=0;k<2*n;k++){t.c[i][j]=(t.c[i][j]+a->c[i][k]*b->c[k][j])%m;}return t;}struct node power(struct node *a,int num){struct node temp;int i,j;for(i=0;i<2*n;i++)for(j=0;j<2*n;j++){if(i==j)temp.c[i][j]=1;elsetemp.c[i][j]=0;}while(num>0){if(num&1)temp=mul(&temp,a);*a=mul(a,a);num>>=1;}return temp;}int main(void){int a,i,j;scanf("%d%d%d",&n,&k,&m);for(i=0;i<n;i++){for(j=0;j<n;j++){scanf("%d",&FAB.c[i][j]);B.c[i][j]=FAB.c[i][j];}B.c[n+i][i]=B.c[n+i][n+i]=1;}B=power(&B,k+1);for(i=0;i<n;i++){for(j=0;j<n;j++){a=B.c[n+i][j]%m;if(i==j)a=(a+m-1)%m;printf("%d ",a);}printf("\n");}    }


 

0 0