[AGC041D] Problem Scores
这是一篇思想极度简洁的题解。
首先先考虑转化一下第三个条件。
令
则我们可以发现满足条件三等价于前
此时再考虑如何刻画第二个条件。
初始时令
维护
容易发现
对于每一个
那么现在就转化为一个完全背包问题:
有
容易使用
简短的代码:
#include <bits/stdc++.h>
using namespace std;
#define N 5005
int n,P,ans,w[N],dp[N];
int main()
{
scanf("%d %d",&n,&P);dp[n]=1;
for(int i=1;i<=(n+1)/2;++i) w[i]=i;
for(int i=1;i<=n/2;++i) w[n-i+1]=i;
for(int i=1;i<=n;++i) for(int j=n;j>=w[i];--j)
dp[j-w[i]]=(dp[j-w[i]]+dp[j])%P;
for(int i=1;i<=n;++i) ans=(ans+dp[i])%P;
printf("%d\n",ans);return 0;
}