题意 :求两两之间的下标差和
设
numc [ i ] 为该段 c的数量
addc [ i ] 为该段 所有c的 下标和 (从0 开始
len [ i ] 为该段 长度
ans[ i ] 为答案
addc[i] 因为i-1段前面的c每个增加的len[i-2] 的长度
所以为 addc[ i-2 ] +addc[ i - 1 ] + len[ i- 2 ]*numc[ i- 1 ]
ans[i] 需要计算 i-2 段 中每个 c 与 i-1 段中每个c的距离和
len[i-2]*numc[ i-2 ] - addc[i-2] 表示 i-2段中每个c 距离 i-2 段末尾的距离和
再乘上个numc[ i-1 ] 再加上 addc[i-1] * numc[ i-2 ]
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#include <queue>
#include <stack>
#include <vector>
#include <bitset>
#include <list>
#include <set>
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <map>
typedef long long LL;
const int INF = 1<<29;
const LL mod = 530600414;
const int MAXN = 201314+7;
const int MAXM = 21101;
LL ans[MAXN];
LL len[MAXN],numc[MAXN],addc[MAXN];
int main()
{
len[3]=3,len[4]=5;
numc[3]=1,numc[4]=1;
addc[3]=0,addc[4]=2;
ans[3]=0,ans[4]=0;
for(int i=5;i<MAXN;i++)
{
len[i]=(len[i-2]+len[i-1])%mod;
numc[i]=(numc[i-2]+numc[i-1])%mod;
addc[i]=(addc[i-2]+addc[i-1]+numc[i-1]*len[i-2])%mod;
ans[i]=(ans[i-2]+ans[i-1]+(len[i-2]*numc[i-2]%mod-addc[i-2]+mod)%mod*numc[i-1]%mod + numc[i-2]*addc[i-1]%mod )%mod;
}
int t,n,cas=0;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
printf("Case #%d: %lld\n",++cas,ans[n]);
}
return 0;
}
/*
*/