POJ 3233 Matrix Power Series

来源:互联网 发布:java开发工程师中心 编辑:程序博客网 时间:2024/06/05 23:51

Description

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

Input

The input contains exactly one test case. The first line of input contains three positive integersn (n ≤ 30),k (k ≤ 109) and m (m < 104). Then follown lines each containingn nonnegative integers below 32,768, givingA’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


题意:给定n*n的矩阵A,整数k,mod值为m。求S=A+A^2+...+A^k。输出S矩阵,并且S的每一个元素对m取余数。


思路:

递推式A+...+A^(2k)=(A+...+A^k)+(A+...+A^k)*A^k

原理:A^2k=(A^k)*(A^k)

如果k为偶数,那么(A+A^2+....A^K) = (A+...+A^K/2)+A^K/2*(A+...+A^K/2)

如果k为奇数,那么(A+A^2+....A^K) = (A+...+A^K/2)+A^K/2*(A+...+A^K/2)+A^k

例子:

A+A^2+A^3+A^4+A^5+A^6=A+A^2+A^3+A^3*(A+A^2+A^3)                     (k为数)

A+A^2+A^3=A+A^2+A^2*(A)                     (k为数)

代码如下:

#include<iostream>#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<algorithm>using namespace std;int n,k;int mod; //n*n阶的矩阵;k是sum=A^1+A^2+.....+A^k;m是被模的元素  struct Matrix{int matrix[50][50];Matrix(int a=0){memset(matrix,0,sizeof(matrix)); //矩阵清零 if(a==1) //单位矩阵for(int i=0;i<50;i++)matrix[i][i]=1;}}m;Matrix operator * (Matrix a,Matrix b){ //矩阵乘法Matrix res;memset(res.matrix,0,sizeof(res.matrix));for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)for(int k=1;k<=n;k++)res.matrix[i][j]=(res.matrix[i][j]+(a.matrix[i][k]*b.matrix[k][j])%mod)%mod;return res;}Matrix operator + (Matrix a,Matrix b){ //矩阵加法Matrix res;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)res.matrix[i][j]=(a.matrix[i][j]+b.matrix[i][j])%mod; return res;}Matrix operator ^ (Matrix a,int k){ //矩阵快速幂bool flag=false;Matrix ans=1;while(k){if(k&1){if(flag)ans=ans*a;else ans=a;flag=true;}a=a*a;k>>=1;}return ans;}Matrix sum(int k){ //求sum( S(k) )= A + A2 + A3 + …+ Akif(k==1)return m; //递归回去 else{Matrix tmp=sum(k>>1); //sum( S(k/2) )if(k&1){ //k为奇数 Matrix tmp2=m^((k>>1)+1); return tmp+tmp2+tmp*tmp2;}else{Matrix tmp2=m^(k>>1);return tmp+tmp*tmp2; //sum( S(k/2) )*(tmp2+1)}}}int main(){int i,j;Matrix ans;scanf("%d%d%d",&n,&k,&mod);for(i=1;i<=n;i++)for(j=1;j<=n;j++){scanf("%d",&m.matrix[i][j]);m.matrix[i][j]%=mod;}ans=sum(k);for(i=1;i<=n;i++,puts(""))for(j=1;j<=n;j++)printf("%d ",ans.matrix[i][j]);return 0;}




1 0
原创粉丝点击