传送门
我们设f[i][j]表示前i个数,第i个数排名是j的方案总数。
我们可以强制第1个数是山峰。然后我们可以将整个序列高度取反,得到其他的方案数。
然后我们发现这样做的时间复杂度是O(N^3)的
加上前缀和优化就是O(N^2)了
var
f:array [0..1,0..5005] of longint;
n,i,j,x,p:longint;
begin
read(n,p);
if (n=1) then begin write(1); exit; end;
x:=0; f[0,2]:=1;
for i:=3 to n+1 do begin
x:=1-x;
for j:=1 to i do f[x,j]:=(f[x,j-1]+f[1-x,i-j+1]) mod p;
end;
write(f[x,n]*2 mod p);
end.