复习母函数,发现这道题可以用矩阵快速幂。。。然后做了一下
母函数:http://blog.csdn.net/acm_cxlove/article/details/7831009 看起来好复杂的样子
列dp方程,构造矩阵
dp【n】【4】;
dp[i][0],表示放到了第i位,前i位中有 偶数个A,有 偶数个C
dp[i][1],表示放到了第i位,前i位中有 奇数个A,有 偶数个C
dp[i][2],表示放到了第i位,前i位中有 偶数个A,有 奇数个C
dp[i][3],表示放到了第i位,前i位中有 奇数个A,有 奇数个C
2 1 1 0
1 2 0 1
1 0 2 1
0 1 1 2
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 10010
const ll mod=100;
struct node
{
ll a[4][4];
}T,I;
node cheng(node A,node B)
{
node C;
int i,j,k;
memset(C.a,0,sizeof(C.a));
for(i=0;i<4;i++)
for(j=0;j<4;j++)
for(k=0;k<4;k++)
{
C.a[i][j]+=A.a[i][k]*B.a[k][j];
C.a[i][j]%=mod;
}
return C;
}
void init()
{
int i,j,k;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(i==j) I.a[i][j]=1;
else I.a[i][j]=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
if(i==j)
T.a[i][j]=2;
else if(i+j==3)
T.a[i][j]=0;
else
T.a[i][j]=1;
}
}
int main()
{
int t;
while(scanf("%d",&t),t)
{
int res=0;
while(t--)
{
res++;
ll n;
cin>>n;
if(n==1)
{
printf("Case %d: 2\n",res);
continue;
}
n--;
init();
while(n)
{
if(n&1) I=cheng(I,T);
n>>=1;
T=cheng(T,T);
}
ll ans=2*I.a[0][0]+I.a[1][0]+I.a[2][0];
ans%=mod;
printf("Case %d: %I64d\n",res,ans);
}
printf("\n");
}
}