现在的位置: 首页 > 综合 > 正文

poj-3233 Matrix Power Series(矩阵快速幂)

2013年11月24日 ⁄ 综合 ⁄ 共 980字 ⁄ 字号 评论关闭

类似a^b的快速幂。很经典一道题。

#include<iostream>
#include<cstdio>
#include<cstring>
typedef __int64 LL;
using namespace std ;

int n,M;
LL k;

struct matrax{
	   int m[35][35];
	   
	   void unit(){
			memset(m,0,sizeof(m));
			for(int i=0;i<n;i++) m[i][i]=1;
	   }  
 
	   matrax operator + (const matrax &a){
			matrax c;
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					c.m[i][j]=(m[i][j]+a.m[i][j])%M;
				}
			}
			return c;
	   }
	   
	   matrax operator * (const matrax &a){
			matrax c;
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					c.m[i][j]=0;
					for(int k=0;k<n;k++) 
					c.m[i][j]=(c.m[i][j]+m[i][k]*a.m[k][j])%M;
				}
			}
			return c;
	   }	   	 
};

matrax A;

matrax operator ^ (matrax a,LL k)
{
    matrax ans;
	ans.unit();
	while(k){
	   if(k&1) ans=ans*a;
		a=a*a;
		k>>=1;
	}
	return ans;
}

matrax Sum(LL k)
{
   if(k==1) return A;
   matrax tmp=Sum(k>>1);
   matrax tmp2;
   if(k&1){
	    tmp2=A^((k>>1)+1);
		return tmp+tmp2+tmp*tmp2;
   }
   else{
	    tmp2=A^(k>>1);
		return tmp+tmp*tmp2;
   }
}

int main()
{
    int i,j;
    while(scanf("%d %I64d %d",&n,&k,&M)!=EOF){
		for(i=0;i<n;i++){
			for(j=0;j<n;j++){
				scanf("%d",&A.m[i][j]);
				A.m[i][j]%=M;
			}
		}
	    matrax ans=Sum(k);
	    for(i=0;i<n;i++){
			for(j=0;j<n;j++)
				printf(j==n-1?"%d\n":"%d ",ans.m[i][j]);
	    }
    }
 	return 0 ;
}

【上篇】
【下篇】

抱歉!评论已关闭.