HDU 5459 根据题意找规律
题意:
求一个字符串所有c字符位置到其它位置所需的步数和。
思路:
就根据题目的意思,如果要求出下一项则需要前两项的和加上前两项移动需要的步数,此时如果能从这里想的话就很简单了。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
const int maxn = 201314+10;
const LL mod = 530600414;
LL ans[maxn],len[maxn],c[maxn],cor[maxn];
void init()
{
c[1] = 1,len[1] = 1,cor[1] = 1;
c[2] = 0,len[2] = 2,cor[2] = 0;
c[3] = 1,len[3] = 3,cor[3] = 1;
c[4] = 1,len[4] = 5,cor[4] = 3;
for(int i = 5;i <= maxn-10; i++) {
c[i] = (c[i-1]+c[i-2])%mod;
len[i] = (len[i-1]+len[i-2])%mod;
cor[i] = (cor[i-2]+cor[i-1]+len[i-2]*c[i-1])%mod;
ans[i] = ((len[i-2]*c[i-2]-cor[i-2]+mod)%mod*c[i-1]%mod + c[i-2]*cor[i-1] + ans[i-1]+ans[i-2])%mod;
}
}
int main()
{
// freopen("in.txt","r",stdin);
init();
int t;
scanf("%d",&t);
int ncase = 1;
while(t--) {
int n;
scanf("%d",&n);
printf("Case #%d: ",ncase++);
printf("%lld\n",ans[n]);
}
return 0;
}