很熟悉的一道题目,很久以前记过一个结论。说到底就是波动数列计数。
运用递推思想。
f[i][j]=f[i][j-1]+f[i-1][j-i]
但是这道题要卡空间,要开一个滚动数列就好了。
#include<bits/stdc++.h>
using namespace std;
long long n,p,now;
long long f[2][4205];
int main()
{
//freopen("in.txt","r",stdin);
cin>>n>>p;
if(n==1)return cout<<1%p,0;
f[0][1]=1%p;
now=0;
for(int i=2;i<=n;i++)
{
now^=1;
for(int j=1;j<=i;j++)
f[now][j]=(f[now][j-1]+f[now^1][i-j])%p;
}
cout<<(f[now][n]*2)%p;
return 0;
}