結果
問題 | No.2303 Frog on Grid |
ユーザー | みここ |
提出日時 | 2023-05-12 22:19:46 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 115 ms / 2,000 ms |
コード長 | 2,003 bytes |
コンパイル時間 | 2,408 ms |
コンパイル使用メモリ | 117,872 KB |
実行使用メモリ | 12,156 KB |
最終ジャッジ日時 | 2024-05-06 12:23:50 |
合計ジャッジ時間 | 4,770 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,376 KB |
testcase_02 | AC | 98 ms
11,752 KB |
testcase_03 | AC | 49 ms
7,456 KB |
testcase_04 | AC | 95 ms
11,696 KB |
testcase_05 | AC | 107 ms
11,840 KB |
testcase_06 | AC | 53 ms
8,404 KB |
testcase_07 | AC | 95 ms
11,556 KB |
testcase_08 | AC | 95 ms
11,700 KB |
testcase_09 | AC | 26 ms
5,772 KB |
testcase_10 | AC | 47 ms
7,520 KB |
testcase_11 | AC | 26 ms
5,776 KB |
testcase_12 | AC | 60 ms
8,352 KB |
testcase_13 | AC | 2 ms
5,376 KB |
testcase_14 | AC | 2 ms
5,376 KB |
testcase_15 | AC | 2 ms
5,376 KB |
testcase_16 | AC | 2 ms
5,376 KB |
testcase_17 | AC | 2 ms
5,376 KB |
testcase_18 | AC | 115 ms
12,024 KB |
testcase_19 | AC | 114 ms
12,024 KB |
testcase_20 | AC | 115 ms
12,156 KB |
testcase_21 | AC | 114 ms
12,024 KB |
testcase_22 | AC | 114 ms
12,028 KB |
ソースコード
#include <iostream> #include <atcoder/convolution> using namespace std; #include <cassert> #include <vector> template <typename MODINT> struct CombinationStructure { public: CombinationStructure() { fact = {1, 1}; fact_inverse = {1, 1}; } void size_up(int n) { int old_n = fact.size() - 1; if (n <= old_n) { return; } n = std::max(n, old_n * 2); fact.resize(n + 1); fact_inverse.resize(n + 1); for (int i = old_n + 1; i <= n; i++) { fact[i] = fact[i - 1] * i; } fact_inverse[n] = fact[n].inv(); for (int i = n - 1; i >= old_n + 1; i--) { fact_inverse[i] = fact_inverse[i + 1] * (i + 1); } } MODINT C(int n, int k) { size_up(n); if (k > n || k < 0) { return 0; } return fact[n] * fact_inverse[k] * fact_inverse[n - k]; } MODINT P(int n, int k) { assert(k >= 0); size_up(n); if (k > n) { return 0; } return fact[n] * fact_inverse[n - k]; } MODINT factorial(int n) { size_up(n); return fact[n]; } MODINT operator()(int n, int k) { return C(n, k); } private: int maxn; std::vector<MODINT> fact; std::vector<MODINT> fact_inverse; }; using mint = atcoder::modint998244353; int main() { int h, w; cin >> h >> w; CombinationStructure<mint> com; vector<mint> d(h + 1), e(w + 1); for (int i = 0; i <= h; i++) { int c = i * 2 - h; d[i] = com(i, c) / com.factorial(i); } for (int i = 0; i <= w; i++) { int c = i * 2 - w; e[i] = com(i, c) / com.factorial(i); } vector<mint> r = atcoder::convolution(d, e); mint ans = 0; for (int i = 0; i <= h + w; i++) { ans += r[i] * com.factorial(i); } cout << ans.val() << endl; }