题意: 解法: 涂绿色相当于红色和蓝色同时涂, 我们可以将单纯的将绿色看作是红色和蓝色涂到了同一个物品上, 所以我们只需要考虑红色和蓝色即可. O(n)枚举红色个数i,计算需要的蓝色个数,使得i和j满足式子i*a+j*b=k, 由于每种颜色可以随便涂,因此ans+=C(n,i)*C(n,j). code: #include<bits/stdc++.h> #define int long long using namespace std; const int maxm=2e6+5; const int mod=998244353; int fac[maxm],inv[maxm]; int n,a,b,k; int ppow(int a,int b,int mod){ int ans=1%mod;a%=mod; while(b){ if(b&1)ans=ans*a%mod; a=a*a%mod; b>>=1; } return ans; } void init(){ fac[0]=1; for(int i=1;i<maxm;i++)fac[i]=fac[i-1]*i%mod; inv[maxm-1]=ppow(fac[maxm-1],mod-2,mod); for(int i=maxm-2;i>=0;i--)inv[i]=(i+1)*inv[i+1]%mod; } int C(int n,int m){ if(m<0||m>n)return 0; return fac[n]*inv[m]%mod*inv[n-m]%mod; } void solve(){ init(); cin>>n>>a>>b>>k; int ans=0; for(int i=0;i<=n&&i*a<=k;i++){ int rem=k-i*a; if(rem%b)continue; int j=rem/b; ans=(ans+C(n,i)*C(n,j)%mod)%mod; } cout<<ans<<endl; } signed main(){ ios::sync_with_stdio(0); solve(); return 0; }