【矩阵快速幂】poj3233 Matrix Power Series

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

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

#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;
}


 

你可能感兴趣的:(【矩阵快速幂】poj3233 Matrix Power Series)