[bzoj1925]地精部落
考虑到影响答案的只有当前这个数在剩余数字中的排序,我们把这个设为状态
- 代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=4201;
int n;ll mod;
ll f[2][N][2];
int nw,pst;
int main()
{
scanf("%d%lld",&n,&mod);
nw=1,pst=0;
f[nw][0][1]=1;f[nw][n][0]=1;
for(int i=1;i<=n;i++){
swap(nw,pst);
memset(f[nw],0,sizeof(f[nw]));
int sum=n-i+1;
ll pre=0;
for(int pos=1;pos<=sum;pos++){
int id=sum-pos+1;
pre+=f[pst][id][0];
pre%=mod;
f[nw][sum-pos][1]=pre;
}
pre=0;
for(int pos=sum;pos;pos--){
int id=sum-pos;
if(id<0)continue;
else pre+=f[pst][id][1];
pre%=mod;
f[nw][sum-pos][0]=pre;
}
}
printf("%lld\n",(f[nw][0][0]+f[nw][0][1])%mod);
}