比赛链接:
B - RGB Coloring
题意:一共n(1e5)个位置,可以填A,B,A+B三种数字,使得最后总和为k(1e10)
思路:ax+by==k 对于A+B的情况,其实就是把A,B随机放,可以重叠。那么O(n)枚举x,找到y。ans+=c(n,x)*c(n,y);
#includeusing namespace std; typedef long long ll; const int maxn=300000+10; const ll mod=998244353; ll n,a,b,k; ll fac[maxn],inv[maxn]; ll qpow_mod(ll x,ll n) { int s=1; while(n) { if(n&1) s=s*x%mod; x=x*x%mod; n>>=1; } return s; } void csh() { fac[0]=1; for(int i=1;i<=300000;i++) fac[i]=fac[i-1]*i%mod; inv[300000]=qpow_mod(fac[300000],mod-2); for(int i=300000;i>0;i--) inv[i-1]=inv[i]*i%mod; } ll C(ll n,ll a) { return fac[n]*inv[a]%mod*inv[n-a]%mod; } int main() { csh(); cin>>n>>a>>b>>k; ll ans=0; for(int i=0;i<=n;i++) { if(((k-i*a)%b!=0)||(k-i*a<0)||((k-i*a)/b>n)) continue; ans=(ans+C(n,i)*C(n,(k-i*a)/b))%mod; } cout< <
n,A,B≤3×105,K≤18×1010