首页 > 代码库 > POJ3233 Matrix Power Series
POJ3233 Matrix Power Series
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 40 11 1
Sample Output
1 22 3
矩阵乘法 快速幂 递归
可以把矩阵当成矩阵里的元素,构建四个矩阵拼成的大矩阵进行快速幂递推;
也可以普通地递归计算:
项数为偶数的时候类似于 (A^1+A^2+A^3+A^4)*(A^4 + I) = A^1+A^2+A^3+A^4+A^5+A^6+A^7+A^7
项数为奇数的时候要加上那个奇数项
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<cmath> 6 using namespace std; 7 int read(){ 8 int x=0,f=1;char ch=getchar(); 9 while(ch<‘0‘ || ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}10 while(ch>=‘0‘ && ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}11 return x*f;12 }13 int n,m,K;14 struct Mat{15 int x[32][32];16 void init(){17 memset(x,0,sizeof x);18 for(int i=1;i<=n;i++)x[i][i]=1;19 return;20 }21 Mat operator + (const Mat &b){22 Mat res;23 for(int i=1;i<=n;i++)24 for(int j=1;j<=n;j++)25 res.x[i][j]=(x[i][j]+b.x[i][j])%m;26 return res;27 }28 Mat operator * (const Mat &b){29 Mat res;30 for(int i=1;i<=n;i++)31 for(int j=1;j<=n;j++){32 res.x[i][j]=0;33 for(int k=1;k<=n;k++)34 (res.x[i][j]+=x[i][k]*b.x[k][j]%m)%=m;35 }36 return res;37 }38 }I,A;39 inline Mat ksm(Mat a,int k){40 Mat res;res.init();41 while(k){42 if(k&1)res=res*a;43 a=a*a;44 k>>=1;45 }46 return res;47 }48 Mat Bcalc(int k){49 if(k==1)return A;50 if(k&1)51 return (ksm(A,k>>1)+I)*Bcalc(k>>1)+ksm(A,k);52 return (ksm(A,k>>1)+I)*Bcalc(k>>1);53 }54 int main(){55 int i,j;56 n=read();K=read();m=read();57 I.init();58 for(i=1;i<=n;i++)59 for(j=1;j<=n;j++)60 A.x[i][j]=read();61 Mat ans=Bcalc(K);62 for(i=1;i<=n;i++){63 for(j=1;j<=n;j++)64 printf("%d ",ans.x[i][j]);65 printf("\n");66 }67 return 0;68 }
POJ3233 Matrix Power Series
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。