正题
题目链接:https://www.luogu.org/problem/P2467
题目大意
求长度为nnn的波动序列的个数。
解题思路
我们先考虑第一个是上升的,然后乘2即可。
设fi,jf_{i,j}fi,j表示填1∼i1\sim i1∼i个,最前面的是jjj的个数。然后我们只要是1∼i−j+11\sim i-j+11∼i−j+1,当然可以填iii那么一定可以填i+1i+1i+1,所以有递推方程fi,j=fi,j−1+fi−1,i−j+1f_{i,j}=f_{i,j-1}+f_{i-1,i-j+1}fi,j=fi,j−1+fi−1,i−j+1
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll n,XJQ,f[2][4300],ans;
int main()
{scanf("%lld%lld",&n,&XJQ);f[0][2]=1;for(ll i=3;i<=n;i++){//memset(f[i&1],0,sizeof(f[i&1]));for(ll j=2;j<=i;j++){f[i&1][j]=(f[i&1][j-1]+f[~i&1][i-j+1])%XJQ;(ans+=f[i&1][j]*(i==n))%=XJQ;}}printf("%lld",(ans<<1)%XJQ);
}