http://acm.hdu.edu.cn/showproblem.php?pid=2065
dp
转移方程:dp[i][1]=2*dp[i-1][1]+dp[i-1][2]+dp[i-1][3];
dp[i][2]=dp[i-1][1]+2*dp[i-1][2]+dp[i-1][4];
dp[i][3]=dp[i-1][1]+2*dp[i-1][3]+dp[i-1][4];
dp[i][4]=dp[i-1][2]+dp[i-1][3]+2*dp[i-1][4];
n太大,直接推会tle,用矩阵+快速幂秒杀
View Code
#include <iostream> using namespace std ; typedef __int64 LL ; void mul(int a[4][4],int b[4][4]) { int c[4][4] ; int i,j,k ; for(i=0;i<4;i++) for(j=0;j<4;j++) c[i][j]=0 ; for(i=0;i<4;i++) for(j=0;j<4;j++) for(k=0;k<4;k++) c[i][j]=(c[i][j]+a[i][k]*b[k][j])%100 ; for(i=0;i<4;i++) for(j=0;j<4;j++) a[i][j]=c[i][j] ; } void qpow(int m[4][4],LL n) { int ans[4][4]={1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1} ; int buff[4][4] ; int i,j ; for(i=0;i<4;i++) for(j=0;j<4;j++) buff[i][j]=m[i][j] ; while(n) { if(n&1) mul(ans,buff) ; mul(buff,buff) ; n>>=1 ; } for(i=0;i<4;i++) for(j=0;j<4;j++) m[i][j]=ans[i][j] ; } int main() { int t ; int m[4][4] ; while(scanf("%d",&t),t) { for(int cas=1;cas<=t;cas++) { LL n ; scanf("%I64d",&n) ; m[0][0]=2,m[0][1]=1,m[0][2]=1,m[0][3]=0, m[1][0]=1,m[1][1]=2,m[1][2]=0,m[1][3]=1, m[2][0]=1,m[2][1]=0,m[2][2]=2,m[2][3]=1, m[3][0]=0,m[3][1]=1,m[3][2]=1,m[3][3]=2 ; qpow(m,n) ; printf("Case %d: %d\n",cas,m[0][0]) ; } putchar('\n') ; } return 0 ; }