結果
問題 | No.1529 Constant Lcm |
ユーザー | Haar |
提出日時 | 2021-06-04 20:20:10 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 362 ms / 3,000 ms |
コード長 | 4,713 bytes |
コンパイル時間 | 2,410 ms |
コンパイル使用メモリ | 211,912 KB |
実行使用メモリ | 11,192 KB |
最終ジャッジ日時 | 2024-11-19 08:41:54 |
合計ジャッジ時間 | 6,990 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,816 KB |
testcase_01 | AC | 2 ms
6,820 KB |
testcase_02 | AC | 2 ms
6,816 KB |
testcase_03 | AC | 2 ms
6,816 KB |
testcase_04 | AC | 2 ms
6,816 KB |
testcase_05 | AC | 2 ms
6,820 KB |
testcase_06 | AC | 2 ms
6,820 KB |
testcase_07 | AC | 2 ms
6,820 KB |
testcase_08 | AC | 2 ms
6,820 KB |
testcase_09 | AC | 2 ms
6,820 KB |
testcase_10 | AC | 322 ms
10,360 KB |
testcase_11 | AC | 122 ms
6,816 KB |
testcase_12 | AC | 7 ms
6,820 KB |
testcase_13 | AC | 275 ms
9,296 KB |
testcase_14 | AC | 164 ms
7,296 KB |
testcase_15 | AC | 180 ms
7,552 KB |
testcase_16 | AC | 143 ms
6,820 KB |
testcase_17 | AC | 76 ms
6,816 KB |
testcase_18 | AC | 82 ms
6,816 KB |
testcase_19 | AC | 173 ms
7,424 KB |
testcase_20 | AC | 360 ms
11,012 KB |
testcase_21 | AC | 359 ms
11,140 KB |
testcase_22 | AC | 354 ms
11,040 KB |
testcase_23 | AC | 362 ms
10,972 KB |
testcase_24 | AC | 353 ms
11,192 KB |
testcase_25 | AC | 348 ms
11,028 KB |
ソースコード
#include <bits/stdc++.h> namespace haar_lib { template <int32_t M> class modint { uint32_t val_; public: constexpr static auto mod() { return M; } constexpr modint() : val_(0) {} constexpr modint(int64_t n) { if (n >= M) val_ = n % M; else if (n < 0) val_ = n % M + M; else val_ = n; } constexpr auto &operator=(const modint &a) { val_ = a.val_; return *this; } constexpr auto &operator+=(const modint &a) { if (val_ + a.val_ >= M) val_ = (uint64_t) val_ + a.val_ - M; else val_ += a.val_; return *this; } constexpr auto &operator-=(const modint &a) { if (val_ < a.val_) val_ += M; val_ -= a.val_; return *this; } constexpr auto &operator*=(const modint &a) { val_ = (uint64_t) val_ * a.val_ % M; return *this; } constexpr auto &operator/=(const modint &a) { val_ = (uint64_t) val_ * a.inv().val_ % M; return *this; } constexpr auto operator+(const modint &a) const { return modint(*this) += a; } constexpr auto operator-(const modint &a) const { return modint(*this) -= a; } constexpr auto operator*(const modint &a) const { return modint(*this) *= a; } constexpr auto operator/(const modint &a) const { return modint(*this) /= a; } constexpr bool operator==(const modint &a) const { return val_ == a.val_; } constexpr bool operator!=(const modint &a) const { return val_ != a.val_; } constexpr auto &operator++() { *this += 1; return *this; } constexpr auto &operator--() { *this -= 1; return *this; } constexpr auto operator++(int) { auto t = *this; *this += 1; return t; } constexpr auto operator--(int) { auto t = *this; *this -= 1; return t; } constexpr static modint pow(int64_t n, int64_t p) { if (p < 0) return pow(n, -p).inv(); int64_t ret = 1, e = n % M; for (; p; (e *= e) %= M, p >>= 1) if (p & 1) (ret *= e) %= M; return ret; } constexpr static modint inv(int64_t a) { int64_t b = M, u = 1, v = 0; while (b) { int64_t t = a / b; a -= t * b; std::swap(a, b); u -= t * v; std::swap(u, v); } u %= M; if (u < 0) u += M; return u; } constexpr static auto frac(int64_t a, int64_t b) { return modint(a) / modint(b); } constexpr auto pow(int64_t p) const { return pow(val_, p); } constexpr auto inv() const { return inv(val_); } friend constexpr auto operator-(const modint &a) { return modint(M - a.val_); } friend constexpr auto operator+(int64_t a, const modint &b) { return modint(a) + b; } friend constexpr auto operator-(int64_t a, const modint &b) { return modint(a) - b; } friend constexpr auto operator*(int64_t a, const modint &b) { return modint(a) * b; } friend constexpr auto operator/(int64_t a, const modint &b) { return modint(a) / b; } friend std::istream &operator>>(std::istream &s, modint &a) { s >> a.val_; return s; } friend std::ostream &operator<<(std::ostream &s, const modint &a) { s << a.val_; return s; } template <int N> static auto div() { static auto value = inv(N); return value; } explicit operator int32_t() const noexcept { return val_; } explicit operator int64_t() const noexcept { return val_; } }; } // namespace haar_lib namespace haar_lib { class prime_factorize_sieve { std::vector<int> p_; public: prime_factorize_sieve() {} prime_factorize_sieve(int N) : p_(N + 1) { for (int i = 2; i <= N; ++i) { if (p_[i] != 0) continue; for (int j = i; j <= N; j += i) { if (p_[j] == 0) p_[j] = i; } } } std::vector<int64_t> factorize(int N) const { std::vector<int64_t> ret; while (N > 1) { ret.push_back(p_[N]); N /= p_[N]; } return ret; } }; } // namespace haar_lib using namespace haar_lib; using mint = modint<998244353>; int main() { int N; std::cin >> N; prime_factorize_sieve f(N); std::vector<int> count(N + 1); for (int i = 1; i <= (N + 1) / 2; ++i) { std::unordered_map<int, int> t; { auto res = f.factorize(i); for (int p : res) t[p] += 1; } { auto res = f.factorize(N - i); for (int p : res) t[p] += 1; } for (auto [p, c] : t) { count[p] = std::max(count[p], c); } } mint ans = 1; for (int i = 1; i <= N; ++i) { ans *= mint::pow(i, count[i]); } std::cout << ans << "\n"; return 0; }