ながめも

競技プログラミングについて

AtCoder Grand Contest AGC025 B - RGB Coloring

B - RGB Coloring

問題へのリンク

解説

各マスの状態が4種類ある

  •  A
  •  A + B
  •  B

デフォルトを無だと考えて、そこに得点を割り振っていくと考えると、 A(B)にするかしないかを A,B独立に決めて、重なったら A+Bにすると考えればよいことがわかる。

よって、 Aの個数を iに決めれば、和が Kになる Bの個数 jは一意に定まり、

 \displaystyle{ j = \frac{K-A \times i}{B} }

になる。ただし (K-A \times x)\%B == 0が条件。

 A,Bの個数がそれぞれ i,jになるような塗り方は _N C_{i} * _N C_jである。これをすべての iについて足し合わせればよい。

計算量は \Theta(N)

実装

struct mint {
};

struct combination {
}C(300010);

int main() {

    ll N, A, B, K;
    cin >> N >> A >> B >> K;
    mint ans = 0;
    for(ll i = 0; i <= N; i++){
        ll rem = K - A * i;
        if(rem < 0)continue;
        if(rem % B > 0)continue;
        ll j = rem / B;
        ans += C.Comb(N,i) * C.Comb(N,j);
    }
    cout << ans << endl;
}