脑力题,怪我脑子不好使,没做出来,参考的别人博客:
链接:https://blog.csdn.net/chenzhenyu123456/article/details/48579695
其实就是前后两项的距离关系,想通了还挺简单的,佩服大佬们比赛那么短时间想出来orz
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node{
ll len;
ll num;
ll sum;
ll ans;
}p[201320];
const ll mod=530600414;
void solve(){
p[3].ans=0;p[3].len=3;p[3].num=1;p[3].sum=1;
p[4].ans=0;p[4].len=5;p[4].num=1;p[4].sum=3;
for(int i=5;i<201320;i++){
p[i].len=(p[i-2].len+p[i-1].len)%mod;
p[i].num=(p[i-2].num+p[i-1].num)%mod;
p[i].sum=(p[i-2].sum+p[i-1].sum+(p[i-2].len*p[i-1].num)%mod)%mod;
p[i].ans=((p[i-2].ans+p[i-1].ans)%mod+(((p[i-2].len*p[i-2].num-p[i-2].sum)%mod)*p[i-1].num)%mod+(p[i-1].sum*p[i-2].num)%mod)%mod;
}
}
int main()
{
solve();
int t;
int cs=1;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
printf("Case #%d: %lld\n",cs++,p[n].ans);
}
return 0;
}