結果
問題 | No.2023 Tiling is Fun |
ユーザー | fura |
提出日時 | 2023-09-12 19:23:24 |
言語 | C++23 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 5 ms / 2,000 ms |
コード長 | 4,810 bytes |
コンパイル時間 | 3,695 ms |
コンパイル使用メモリ | 266,164 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-06-30 07:03:41 |
合計ジャッジ時間 | 4,600 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,816 KB |
testcase_01 | AC | 4 ms
6,944 KB |
testcase_02 | AC | 2 ms
6,940 KB |
testcase_03 | AC | 3 ms
6,940 KB |
testcase_04 | AC | 2 ms
6,944 KB |
testcase_05 | AC | 3 ms
6,940 KB |
testcase_06 | AC | 3 ms
6,944 KB |
testcase_07 | AC | 4 ms
6,940 KB |
testcase_08 | AC | 4 ms
6,944 KB |
testcase_09 | AC | 4 ms
6,940 KB |
testcase_10 | AC | 4 ms
6,940 KB |
testcase_11 | AC | 2 ms
6,944 KB |
testcase_12 | AC | 2 ms
6,944 KB |
testcase_13 | AC | 2 ms
6,940 KB |
testcase_14 | AC | 4 ms
6,940 KB |
testcase_15 | AC | 4 ms
6,940 KB |
testcase_16 | AC | 4 ms
6,944 KB |
testcase_17 | AC | 5 ms
6,944 KB |
testcase_18 | AC | 5 ms
6,944 KB |
testcase_19 | AC | 4 ms
6,940 KB |
ソースコード
#ifndef TEMPLATE_HPP #define TEMPLATE_HPP #pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #include <bits/stdc++.h> #define impl_overload4(a, b, c, d, e, ...) e #define impl_overload5(a, b, c, d, e, f, ...) f #define impl_overload6(a, b, c, d, e, f, g, ...) g #define impl_overload7(a, b, c, d, e, f, g, h, ...) h // clang-format off #define impl_rep4(i, a, b, c) for (int i = (a); i < (b); i += (c)) #define impl_rep3(i, a, b) impl_rep4(i, a, b, 1) #define impl_rep2(i, n) impl_rep3(i, 0, n) #define impl_rep1(n) for (int _ = 0; _ < (n); ++_) #define rep(...) impl_overload4(__VA_ARGS__, impl_rep4, impl_rep3, impl_rep2, impl_rep1)(__VA_ARGS__) #define impl_rrep4(i, a, b, c) for (int i = (b) - 1; i >= (a); i -= (c)) #define impl_rrep3(i, a, b) impl_rrep4(i, a, b, 1) #define impl_rrep2(i, n) impl_rrep3(i, 0, n) #define rrep(...) impl_overload4(__VA_ARGS__, impl_rrep4, impl_rrep3, impl_rrep2)(__VA_ARGS__) // clang-format on #define all(v) std::begin(v), std::end(v) template<typename T> constexpr int bit(T x, unsigned int k) { return (x >> k) & 1; } template<typename T> constexpr bool chmax(T& a, const T& b) { return a < b ? a = b, true : false; } template<typename T> constexpr bool chmin(T& a, const T& b) { return a > b ? a = b, true : false; } void yesno(bool b) { std::cout << (b ? "Yes" : "No") << "\n"; } void yes() { yesno(true); } void no() { yesno(false); } struct Setup { Setup() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); std::cout << std::fixed << std::setprecision(11); } } setup; #ifdef LOCAL #include "template_local.hpp" #else #define show(...) ((void)0) #endif using uint = unsigned int; using lint = long long; using ulint = unsigned long long; using namespace std; #endif // TEMPLATE_HPP class mint { static const int MOD = 998244353; int x; public: mint(): x(0) {} mint(long long y) { x = y % MOD; if (x < 0) x += MOD; } mint& operator+=(const mint& m) { x += m.x; if (x >= MOD) x -= MOD; return *this; } mint& operator-=(const mint& m) { x -= m.x; if (x < 0) x += MOD; return *this; } mint& operator*=(const mint& m) { x = (long long)x * m.x % MOD; return *this; } mint& operator/=(const mint& m) { return *this *= inverse(m); } mint operator+(const mint& m) const { return mint(*this) += m; } mint operator-(const mint& m) const { return mint(*this) -= m; } mint operator*(const mint& m) const { return mint(*this) *= m; } mint operator/(const mint& m) const { return mint(*this) /= m; } mint operator-() const { return -x; } friend mint inverse(const mint& m) { int a = m.x, b = MOD, u = 1, v = 0; while (b > 0) { int t = a / b; a -= t * b; swap(a, b); u -= t * v; swap(u, v); } return u; } friend istream& operator>>(istream& is, mint& m) { long long t; is >> t; m = t; return is; } friend ostream& operator<<(ostream& os, const mint& m) { return os << m.x; } int to_int() const { return x; } }; mint operator+(long long x, const mint& m) { return mint(x) + m; } mint operator-(long long x, const mint& m) { return mint(x) - m; } mint operator*(long long x, const mint& m) { return mint(x) * m; } mint operator/(long long x, const mint& m) { return mint(x) / m; } mint pow(mint m, long long k) { mint res = 1; for (; k > 0; k >>= 1, m *= m) if (k & 1) res *= m; return res; } mint factorial(int n) { static vector<mint> memo = {1}; if (memo.size() <= n) { int k = memo.size(); memo.resize(n + 1); for (; k <= n; k++) memo[k] = memo[k - 1] * k; } return memo[n]; } mint factorial_inverse(int n) { static vector<mint> memo = {1}; if (memo.size() <= n) { int k = memo.size(); memo.resize(n + 1); memo[n] = inverse(factorial(n)); for (int i = n; i > k; i--) memo[i - 1] = memo[i] * i; } return memo[n]; } mint choose(int n, int k, int type = 0) { if (k == 0) return 1; if (n < k) return 0; if (type == 0) { return factorial(n) * factorial_inverse(k) * factorial_inverse(n - k); } else { if (k > n - k) k = n - k; mint res = factorial_inverse(k); rep (i, k) res *= n - i; return res; } } mint multichoose(int n, int k, int type = 0) { return choose(n + k - 1, k, type); } int main() { int a, b; cin >> a >> b; cout << choose(a + b - 2, a - 1) << endl; return 0; }