結果
| 問題 | No.1771 A DELETEQ | 
| コンテスト | |
| ユーザー |  hitonanode | 
| 提出日時 | 2021-11-23 10:13:53 | 
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 89 ms / 3,500 ms | 
| コード長 | 1,245 bytes | 
| コンパイル時間 | 950 ms | 
| コンパイル使用メモリ | 96,408 KB | 
| 実行使用メモリ | 11,148 KB | 
| 最終ジャッジ日時 | 2024-07-03 21:09:32 | 
| 合計ジャッジ時間 | 5,815 ms | 
| ジャッジサーバーID (参考情報) | judge1 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 27 RE * 11 | 
ソースコード
#include <cassert>
#include <iostream>
#include <vector>
using namespace std;
#include <atcoder/modint>
using mint = atcoder::modint998244353;
template <typename modint> struct acl_fac {
    std::vector<modint> facs, facinvs;
    acl_fac(int N) {
        assert(-1 <= N and N < modint::mod());
        facs.resize(N + 1, 1);
        for (int i = 1; i <= N; i++) facs[i] = facs[i - 1] * i;
        facinvs.assign(N + 1, facs.back().inv());
        for (int i = N; i > 0; i--) facinvs[i - 1] = facinvs[i] * i;
    }
    modint ncr(int n, int r) const {
        if (n < 0 or r < 0 or n < r) return 0;
        return facs[n] * facinvs[r] * facinvs[n - r];
    }
    modint operator[](int i) const { return facs[i]; }
    modint finv(int i) const { return facinvs[i]; }
};
acl_fac<mint> fac(1000000);
int main() {
    int X, Y;
    cin >> X >> Y;
    if (X > Y) swap(X, Y);
    int K = Y - X;
    mint ret = 0;
    mint pow2 = 1;  // 2^i
    for (int i = 0; i <= X; ++i) { // i: (# of AA) + (# of BB)
        for (int j = 0; i + j <= X; ++j) {  // j: (# of AB)
            int k = j + K; // k: (# of BA)
            ret += fac.ncr(i + j + k, i) * fac.ncr(j + k, j) * pow2;
        }
        pow2 *= 2;
    }
    cout << ret.val() << '\n';
}
            
            
            
        