Atcoder Grand Contest 025

比赛链接: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,B3×105,K18×1010

 

posted @ 2018-06-10 18:20  Somnus、M  阅读(129)  评论(0编辑  收藏  举报