http://acm.hdu.edu.cn/showproblem.php?pid=5459
POINT:
f(n)=f(n-2)+f(n-1).
答案是n-2的数量和n-1的数量。和他们互相的贡献
主要是算互相的贡献。
pre:每个C到字符串最左边的和。
suf:每个C到字符串最右边的和。
num:C的数量
len:字符串长度。
看代码很好理解。
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
using namespace std;
const LL maxn = 5e6+66;
const LL mod = 530600414;
LL dp[210000];
LL len[210000];
LL pre[210000];
LL suf[210000];
LL num[210000];
int main()
{
LL T;
scanf("%lld",&T);
pre[2]=suf[2]=0;
len[2]=2;
num[2]=0;num[3]=1;
dp[2]=dp[3]=0;
pre[3]=1;suf[3]=3;len[3]=3;
for(LL i=4;i<=201314;i++){
dp[i]=dp[i-1]+dp[i-2]+num[i-2]*(pre[i-1]-num[i-1]+mod)%mod+num[i-1]*suf[i-2]%mod;//-num[i-1]是因为不重复
dp[i]%=mod;
num[i]=num[i-1]+num[i-2];
num[i]%=mod;
len[i]=len[i-1]+len[i-2];
len[i]%=mod;
pre[i]=pre[i-1]+pre[i-2]+num[i-1]*len[i-2]%mod;
pre[i]%=mod;
suf[i]=suf[i-1]+suf[i-2]+num[i-2]*len[i-1]%mod;
suf[i]%=mod;
}
int cas=0;
while(T--){
LL n;
scanf("%lld",&n);
printf("Case #%d: %lld\n",++cas,dp[n]);
}
return 0;
}