比赛链接:https://agc025.contest.atcoder.jp/
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);
#include <iostream>
using 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<<ans<<endl;
return 0;
}
n,A,B≤3×105,K