結果
問題 | No.1655 123 Swaps |
ユーザー | noshi91 |
提出日時 | 2021-08-20 23:31:38 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 246 ms / 2,000 ms |
コード長 | 4,673 bytes |
コンパイル時間 | 2,518 ms |
コンパイル使用メモリ | 124,440 KB |
実行使用メモリ | 25,492 KB |
最終ジャッジ日時 | 2024-10-14 07:21:12 |
合計ジャッジ時間 | 7,684 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,820 KB |
testcase_01 | AC | 2 ms
6,816 KB |
testcase_02 | AC | 2 ms
6,816 KB |
testcase_03 | AC | 2 ms
6,820 KB |
testcase_04 | AC | 2 ms
6,816 KB |
testcase_05 | AC | 2 ms
6,820 KB |
testcase_06 | AC | 2 ms
6,816 KB |
testcase_07 | AC | 2 ms
6,816 KB |
testcase_08 | AC | 2 ms
6,816 KB |
testcase_09 | AC | 2 ms
6,820 KB |
testcase_10 | AC | 2 ms
6,816 KB |
testcase_11 | AC | 2 ms
6,820 KB |
testcase_12 | AC | 2 ms
6,816 KB |
testcase_13 | AC | 2 ms
6,820 KB |
testcase_14 | AC | 2 ms
6,820 KB |
testcase_15 | AC | 243 ms
25,044 KB |
testcase_16 | AC | 243 ms
25,060 KB |
testcase_17 | AC | 244 ms
25,000 KB |
testcase_18 | AC | 240 ms
25,340 KB |
testcase_19 | AC | 246 ms
25,412 KB |
testcase_20 | AC | 242 ms
25,312 KB |
testcase_21 | AC | 243 ms
25,264 KB |
testcase_22 | AC | 243 ms
25,432 KB |
testcase_23 | AC | 243 ms
25,436 KB |
testcase_24 | AC | 243 ms
25,480 KB |
testcase_25 | AC | 243 ms
25,492 KB |
testcase_26 | AC | 127 ms
16,468 KB |
testcase_27 | AC | 127 ms
16,312 KB |
testcase_28 | AC | 124 ms
16,316 KB |
testcase_29 | AC | 128 ms
16,312 KB |
testcase_30 | AC | 128 ms
16,348 KB |
testcase_31 | AC | 127 ms
16,452 KB |
testcase_32 | AC | 2 ms
6,820 KB |
testcase_33 | AC | 2 ms
6,816 KB |
testcase_34 | AC | 2 ms
6,816 KB |
testcase_35 | AC | 62 ms
9,904 KB |
testcase_36 | AC | 62 ms
9,952 KB |
testcase_37 | AC | 62 ms
10,012 KB |
testcase_38 | AC | 128 ms
16,780 KB |
testcase_39 | AC | 128 ms
16,464 KB |
testcase_40 | AC | 127 ms
16,288 KB |
testcase_41 | AC | 2 ms
6,820 KB |
testcase_42 | AC | 2 ms
6,816 KB |
testcase_43 | AC | 2 ms
6,816 KB |
testcase_44 | AC | 2 ms
6,816 KB |
ソースコード
//#define NDEBUG #pragma warning(disable : 4146) #include <algorithm> #include <cassert> #include <cstddef> #include <cstdint> #include <iomanip> #include <iostream> #include <utility> #include <vector> namespace n91 { using i32 = std::int32_t; using i64 = std::int64_t; using u32 = std::uint32_t; using u64 = std::uint64_t; using isize = std::ptrdiff_t; using usize = std::size_t; using f64 = double; struct rep { struct itr { usize i; constexpr itr(const usize i) noexcept : i(i) {} void operator++() noexcept { ++i; } constexpr usize operator*() const noexcept { return i; } constexpr bool operator!=(const itr x) const noexcept { return i != x.i; } }; const itr f, l; constexpr rep(const usize f, const usize l) noexcept : f(std::min(f, l)), l(l) {} constexpr auto begin() const noexcept { return f; } constexpr auto end() const noexcept { return l; } }; struct revrep { struct itr { usize i; constexpr itr(const usize i) noexcept : i(i) {} void operator++() noexcept { --i; } constexpr usize operator*() const noexcept { return i; } constexpr bool operator!=(const itr x) const noexcept { return i != x.i; } }; const itr f, l; constexpr revrep(const usize f, const usize l) noexcept : f(l - 1), l(std::min(f, l) - 1) {} constexpr auto begin() const noexcept { return f; } constexpr auto end() const noexcept { return l; } }; template <class T> auto md_vec(const usize n, const T &value) { return std::vector<T>(n, value); } template <class... Args> auto md_vec(const usize n, Args... args) { return std::vector<decltype(md_vec(args...))>(n, md_vec(args...)); } template <class T> constexpr T difference(const T &a, const T &b) noexcept { return a < b ? b - a : a - b; } template <class T> void chmin(T &a, const T &b) noexcept { if (b < a) a = b; } template <class T> void chmax(T &a, const T &b) noexcept { if (a < b) a = b; } template <class F> class rec_lambda { F f; public: rec_lambda(F &&f_) : f(std::forward<F>(f_)) {} template <class... Args> auto operator()(Args &&... args) const { return f(*this, std::forward<Args>(args)...); } }; template <class T> T scan() { T ret; std::cin >> ret; return ret; } constexpr char eoln = '\n'; template <class T> T ceildiv(const T &l, const T &r) { return l / r + (l % r != 0 ? 1 : 0); } #ifdef N91_LOCAL #define OJ_LOCAL(a, b) b #else #define OJ_LOCAL(a, b) a #endif } // namespace n91 #include <atcoder/convolution> #include <atcoder/modint> #include <vector> namespace n91 { template <class T> class mint_utils { using usize = std::size_t; std::vector<T> fact_, inv_fact_; public: mint_utils() : fact_(), inv_fact_() {} explicit mint_utils(const usize n) : fact_(n + 1), inv_fact_(n + 1) { fact_[0] = 1; for (usize i = 0; i != n; i += 1) { fact_[i + 1] = fact_[i] * (i + 1); } inv_fact_[n] = T(1) / fact_[n]; for (usize i = n; i != 0; i -= 1) { inv_fact_[i - 1] = inv_fact_[i] * i; } } T fact(const usize n) const { return fact_[n]; } T inv_fact(const usize n) const { return inv_fact_[n]; } T binom(const usize n, const usize r) const { return fact_[n] * inv_fact_[r] * inv_fact_[n - r]; } T homo(const usize n, const usize r) const { return fact_[n + r - 1] * inv_fact_[n] * inv_fact_[r - 1]; } }; } // namespace n91 #include <array> namespace n91 { void main_() { using mint = atcoder::static_modint<924844033>; const usize A = scan<usize>(); const usize B = scan<usize>(); const usize C = scan<usize>(); if ((A + B + C) % 2 == 1) { std::cout << 0 << eoln; return; } const usize N = (A + B + C) / 2; std::array<std::vector<mint>, 3> s, t; std::fill(s.begin(), s.end(), std::vector<mint>(N + 1, 0)); t = s; const mint_utils<mint> util(2 * N + 1); for (const usize i : rep(0, std::min(B, N) + 1)) { s[(2 * i + 2 * B) % 3][i] += util.inv_fact(i) * util.inv_fact(B - i); } for (const usize i : rep(0, std::min(C, N) + 1)) { t[(C + i) % 3][i] += util.inv_fact(i) * util.inv_fact(C - i); } mint ans = 0; for (const usize d : rep(0, 3)) { const auto &x = s[d]; const auto &y = t[(3 - d) % 3]; const auto z = atcoder::convolution(x, y); for (const usize i : rep(0, z.size())) { if (N >= i && A + i >= N) { ans += z[i] * util.inv_fact(N - i) * util.inv_fact(A + i - N); } } } ans *= util.fact(N) * util.fact(N); std::cout << ans.val() << eoln; } } // namespace n91 int main() { //* std::ios::sync_with_stdio(false); std::cin.tie(nullptr); //*/ std::cout << std::setprecision(20); n91::main_(); return 0; }