Jesus Is Here
题目链接
题目大意
题目给了字符串的前面两项,要求求如下项:
∑i<j:sn[i..i+2]=sn[j..j+2]=‘‘cff"(j−i) mod 530600414
题解
其实就是前两项加字符串加起来成为后面的一个串,那么当前ans就是:
前面串的ans+后面串的ans+两串中间多余长度。
多搞几个数组从头往后推就行了。
代码
#include <iostream>
#include <cstring>
#include <cstdio>
#define maxn 201320
#define MOD 530600414
#define LL long long
using namespace std;
int T,n;
LL s[maxn],c1[maxn],c2[maxn],f[maxn],len[maxn],a[2]={3,5};
void solve(int high)
{
for (int i=5;i<=high;i++)
{
f[i]=(f[i-1]+f[i-2])%MOD;
c1[i]=(c1[i-1]+c1[i-2]+f[i-1]*(len[i-2]+a[i&1]))%MOD;
c2[i]=(c2[i-1]+c2[i-2]+f[i-2]*(len[i-1]+a[i&1]))%MOD;
len[i]=(len[i-1]+len[i-2]+a[i&1])%MOD;
s[i]=(f[i-2]*c1[i-1]+f[i-1]*c2[i-2]+f[i-1]*f[i-2]*a[i&1]+s[i-1]+s[i-2])%MOD;
}
}
int main()
{
f[3]=1; f[4]=1;
s[3]=0; s[4]=0;
solve(maxn);
int Case=1;
scanf("%d",&T);
while (T--)
{
scanf("%d",&n);
printf("Case #%d: %I64d\n",Case++,s[n]);
}
return 0;
}