https://www.lydsy.com/JudgeOnline/problem.php?id=1925
对于$a_1<a_2$的排列可以与$a_2<a_1$的排列一一对应
所以只计算第一种情况(偶数位为山峰),最后乘2即可
$f_i$表示$n=i$的方案数
$f_i=\sum_{j=2 且 2|j}^{n}{f_{j-1}*f_{i-j}*\binom{i-1}{j-1}}$
乘法原理,很好理解
#include<bits/stdc++.h> using namespace std; const int N=4205; int n,mod=1; long long f[N],C1[N],C2[N]; int main() { freopen("d.in","r",stdin); freopen("d.out","w",stdout); scanf("%d%d",&n,&mod); f[0]=f[1]=1; C1[1]=C1[0]=1; for(int i=2;i<=n;++i) { for(int j=2;j<=i;j+=2) f[i]=(f[i]+f[j-1]*f[i-j]%mod*C1[j-1]%mod)%mod; swap(C1,C2); C1[i]=C1[0]=1;//节省空间算组合数 for(int j=1;j<i;++j) C1[j]=(C2[j]+C2[j-1])%mod; } printf("%lld",(f[n]<<1)%mod); return 0; }