题解:P10259 [COCI 2023/2024 #5] Piratski kod
Chenyichen0420 · · 题解
思路分析
一看就差不多知道是
首先,一个很自然的想法是令
思考转移。显然
我们思考一下这些转移系数是什么。对应到
于是现在我们思考怎么快速的求出
那么显然,只有在一个末尾为
考虑
于是我们首先通过
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define int long long
constexpr bool online=0;
constexpr int mod=1e9+7;
int n,fi[5005],dv[5005][2],dc[5005][2],va[5005],vc[5005],anv[5005],anc[5005];
signed main(){
if(online)
freopen("piratski.in","r",stdin),
freopen("piratski.out","w",stdout);
ios::sync_with_stdio(0); fi[0]=fi[1]=1;
for(int i=2;i<=5000;++i) fi[i]=(fi[i-1]+fi[i-2])%mod;
dv[1][1]=dc[1][1]=dc[1][0]=1; dv[1][0]=0;
for(int i=2;i<=5000;++i){
va[i]=dv[i-1][1]; vc[i]=dc[i-1][1];
dv[i][1]=(dv[i-1][0]+dc[i-1][0]*fi[i])%mod;
dv[i][0]=(dv[i-1][1]+dv[i-1][0])%mod;
dc[i][0]=(dc[i-1][1]+dc[i-1][0])%mod;
dc[i][1]=dc[i-1][0];
}
anc[0]=1; cin>>n;
for(int i=2;i<=5000;++i)
for(int j=2;j<=i;++j)
anv[i]=(anv[i]+anv[i-j]*vc[j]+anc[i-j]*va[j])%mod,
anc[i]=(anc[i]+anc[i-j]*vc[j])%mod;
for(int i=n;i>=1;i--)
for(int j=1;j<=i;++j)
anv[i]=(anv[i]+anv[i-j]*fi[j+1])%mod;
for(int i=1;i<=n;++i) cout<<anv[i]<<" ";
cout<<endl;
}