(dp)
C++ 代码
#include <bits/stdc++.h>
using namespace std;
int n,m,s,a,b;
const int N=1010,mod=100000007;
int f[N][N];
//f[i][j]表示要选i个a或者-b且余数为j的所有集合的数量
//s与(n−1)∗d1+(n−2)∗d2+(n−3)∗d3+…+dn−1模x的余数相同。
//则f[i][j] 表示 (n−1)d1+(n−2)d2+…+dn−1序列的前 i 项之和对 n 取模余数为 j 的方案数
int getmod(int a,int b)
{
return (a%b+b)%b;
}
int main()
{
cin>>n>>s>>a>>b;
f[0][0]=1;
for(int i=1;i<n;i++)
{
for(int j=0;j<n;j++)
{
f[i][j]=(f[i-1][getmod(j-(n-i)*a,n)]+f[i-1][getmod(j+(n-i)*b,n)])%mod;
}
}
cout<<f[n-1][getmod(s,n)]<<endl;//最多选n-1个a或b
return 0;
}