这题,我看完第一想法就是搜索,
看看数据,应该只能拿30分,,,,
后来看看网上题解,是dp
设首项为x,可以得到一个等式x+(x+P)+(x+2P)+...+(x+(n-1)P)=s,将这个式子整理一下,就是nx+P+2P+...+(n-1)P=s,即(s-(P+2P+...+(n-1)P))/n=x。
所以,p最多有 n*(n-1)/2 项,
那么枚举a,b的项数自然也就出来了。
然后dp[i][j] 表示长度为i a个数为j的组合数。
当 i>j f[i][j]=f[i-1][j],
i<=j f[i][j]=f[i-1][j]+f[i-1][j-i]
压缩状态,90分,,,
其实一维就能表示,
f[j]=f[j],
i<=j f[j]=f[j]+f[j-i];
#include<bits/stdc++.h>
#define MOD 100000007
#define ll long long
const int maxn=2e3+10;
using namespace std;
int dp[maxn*maxn];
ll n,s,a,b;
int main(){
scanf("%I64d%I64d%I64d%I64d",&n,&s,&a,&b);
dp[0]=1;
ll ans=0;
for(int i=1;i<n;++i){
for(int j=i*(i+1)/2;j>=0;--j){
if(i>j)
dp[j]=dp[j]%MOD;
else
dp[j]=(dp[j]+dp[j-i])%MOD;
}
}
for(int i=0;i<=n*(n-1)/2;++i){
ll t=s-i*a+(n*(n-1)/2-i)*b;
if(t%n==0)
ans=(ans+dp[i])%MOD;
}
printf("%I64d\n",ans);
return 0;
}