当前位置: 代码迷 >> 综合 >> POJ 2440 矩阵乘法
  详细解决方案

POJ 2440 矩阵乘法

热度:88   发布时间:2024-01-20 20:31:31.0

请看下面的转换图:


其中红线表示非法转换,蓝线表示合法转换。这样就可以构建4x4的矩阵了。

接下来快速幂...ac。

#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;struct node
{ int m[4][4]; }res,temp,mod;int n;node matriXmult( node a,node b )
{node c;memset( c.m,0,sizeof(c.m) );for( int i=0;i<4;i++ )for( int j=0;j<4;j++ )for( int k=0;k<4;k++ )c.m[i][j]+=a.m[i][k]*b.m[k][j];for( int i=0;i<4;i++ )for( int j=0;j<4;j++ )c.m[i][j]%=2005;return c;
}void matrix_Power()
{memset( res.m,0,sizeof(res.m) );memset( temp.m,0,sizeof(temp.m) );for( int i=0;i<4;i++ ){res.m[i][i]=1;for( int j=0;j<4;j++ )temp.m[i][j]=mod.m[i][j];}for( int i=0;i<31;i++ ){if( n&(1<<i) )res=matriXmult(res,temp);temp=matriXmult(temp,temp);}
}
int main()
{memset( mod.m,0,sizeof(mod.m) );mod.m[0][0]=mod.m[0][1]=mod.m[1][2]=mod.m[1][3]=1;mod.m[2][0]=mod.m[3][2]=1;while( scanf("%d",&n)!=EOF ){if( n==1 ){printf("2\n");continue;}if( n==2 ){printf( "4\n");continue;}n-=2;matrix_Power();int sum=0;for( int i=0;i<4;i++ )for( int j=0;j<4;j++ )sum+=res.m[i][j];printf( "%d\n",sum%2005 );}
}