【矩阵快速幂】poj3233 Matrix Power Series

来源:互联网 发布:php打开服务器本地程序 编辑:程序博客网 时间:2024/05/16 01:14

算是比较简单的一道题目,可以练一下矩阵快速幂的的基本算法。

废话不多说,直接上代码。

#include<iostream>using namespace std;struct MATRIX{int matrix[31][31];};MATRIX matrix_mul(MATRIX a,MATRIX b);MATRIX matrix_add(MATRIX a,MATRIX b);MATRIX matrix_mi(MATRIX ma,int p);MATRIX calculate(MATRIX ma,int p);int n,k,m;MATRIX ori;int main(){cin>>n>>k>>m;for(int i=0;i<n;i++)for(int j=0;j<n;j++)cin>>ori.matrix[i][j];ori=calculate(ori,k);for(int i=0;i<n;i++){cout<<ori.matrix[i][0];for(int j=1;j<n;j++)cout<<" "<<ori.matrix[i][j];cout<<endl; }//system("pause");return 0;}MATRIX matrix_mi(MATRIX ma,int p){MATRIX tmp;if(p==1)return ma;tmp=matrix_mi(ma,p/2);tmp=matrix_mul(tmp,tmp);if(p%2==1)tmp=matrix_mul(tmp,ma);return tmp;}MATRIX matrix_add(MATRIX a,MATRIX b){MATRIX tmp;for(int i=0;i<n;i++)for(int j=0;j<n;j++)tmp.matrix[i][j]=(a.matrix[i][j]+b.matrix[i][j])%m;return tmp;}MATRIX matrix_mul(MATRIX a,MATRIX b){MATRIX tmp;for(int i=0;i<n;i++)for(int j=0;j<n;j++)tmp.matrix[i][j]=0;for(int i=0;i<n;i++)for(int j=0;j<n;j++)for(int k=0;k<n;k++){tmp.matrix[i][j]+=(a.matrix[i][k]*b.matrix[k][j])%m;tmp.matrix[i][j]%=m;}return tmp;}MATRIX calculate(MATRIX ma,int p){MATRIX tmp,tmp1,tmp2;if(p==1)return ma;if(p%2==0){tmp=matrix_mi(ma,p/2);tmp1=calculate(ma, p/2);tmp2=matrix_mul(tmp,tmp1);tmp=matrix_add(tmp1,tmp2);//return tmp;}else if(p%2==1){tmp=calculate(ma,p-1);tmp1=matrix_mul(ma,tmp);tmp=matrix_add(ma,tmp1);//return tmp;}return tmp;}


 

原创粉丝点击