絶滅

どうでもいい

ARC076 - C

C - Reconciled?

問題ページ


区別可能な犬 N 匹と猿 M 匹を一列に並べる.
犬同士・猿同士が隣り合わないような並べ方の総数を 1e9 + 7 で割った余りを求める.


  • abs(N - M) ≧ 2 となる場合
    互い違いに並べるのは不可能.0 を返す.

  • abs(N - M) = 1 となる場合
    多い方を a,少ない方を b とすると,abab...baba のように並べることが可能.
    $\max (N, M)! \times \min (N, M)! \ \mod 1000000007$ が答え.

  • abs(N - M) = 0 となる場合
    abab...abab または baba...baba のように並べることが可能.
    $\max (N, M)! \times \min (N, M)! \times 2 \ \mod 1000000007$ が答え.


ll modfac(ll n, ll MOD = 1000000007) {
    ll res = 1;
    for (ll i = 1; i <= n; i++) 
        res = res * i % MOD;
    return res;
}

int main() {

    cin.tie(0);
    ios::sync_with_stdio(false);

    ll N, M, MOD = 1000000007;
    cin >> N >> M;

    if (abs(N - M) >= 2) {
        cout << 0 << endl;
        return 0;
    }

    cout << modfac(N) * modfac(M) * (N == M ? 2 : 1) % MOD << endl;

    return 0;
}

Submission #2529703 - AtCoder Regular Contest 076