POJ 2440 矩阵乘法

来源:互联网 发布:纪念币价格走势软件 编辑:程序博客网 时间:2024/04/28 03:07

请看下面的转换图:


其中红线表示非法转换,蓝线表示合法转换。这样就可以构建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 );  }}



原创粉丝点击