結果
| 問題 |
No.1396 Giri
|
| コンテスト | |
| ユーザー |
sten_san
|
| 提出日時 | 2021-02-14 23:16:46 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 463 ms / 2,000 ms |
| コード長 | 2,861 bytes |
| コンパイル時間 | 2,133 ms |
| コンパイル使用メモリ | 206,768 KB |
| 最終ジャッジ日時 | 2025-01-18 21:05:55 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 23 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
struct iofast_t {
iofast_t() {
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
}
} iofast;
struct uns_t {} uns;
template <typename Element, typename Head, typename ...Args>
auto vec(Element init, Head arg, Args ...args) {
if constexpr (sizeof...(Args) == 0) return std::vector(arg, init);
else return std::vector(arg, vec(init, args...));
}
template <typename Element, typename Head, typename ...Args>
auto vec(uns_t, Head arg, Args ...args) {
return vec(Element(), arg, args...);
}
int main() {
constexpr int64_t mod = 998244353;
auto mpow = [&](int64_t a, int64_t b, int64_t m) {
int64_t ans = 1;
while (b) {
if (b & 1) {
ans = (ans * a) % m;
}
a = (a * a) % m;
b >>= 1;
}
return ans;
};
auto minv = [&](int64_t a, int64_t m) {
return mpow(a, m - 2, m);
};
int n; cin >> n;
auto sieve = vec<int>(uns, n + 1);
iota(begin(sieve), end(sieve), 0);
for (int64_t i = 2; i * i <= n; ++i) {
if (sieve[i] != i) continue;
for (int64_t j = i * i; j <= n; j += i) {
if (sieve[j] == j) {
sieve[j] = i;
}
}
}
auto prime_factor = [&](int64_t a) {
auto pf = vec<tuple<int, int>>(uns, 0);
while (a != 1) {
int d = sieve[a], cnt = 0;
while (a % d == 0) {
a /= d;
++cnt;
}
pf.emplace_back(d, cnt);
}
return pf;
};
auto primes = vec<tuple<int, int>>(uns, n + 1, 0);
for (int i = 2; i <= n; ++i) {
primes[i] = prime_factor(i);
}
auto lcm = [&]() {
auto p = vec<int>(0, n + 1);
for (int i = 2; i <= n; ++i) {
for (auto [a, b] : primes[i]) {
p[a] = max(p[a], b);
}
}
int64_t ans = 1;
for (int i = 0; i < size(p); ++i) {
ans = (ans * mpow(i, p[i], mod)) % mod;
}
return ans;
}();
auto p = vec<array<int, 32>>(uns, n + 1);
for (int i = 1; i <= n; ++i) {
for (auto [a, b] : primes[i]) {
++p[a][b];
}
}
int64_t ans = lcm, removed = 1;
for (int i = 2; i <= n; ++i) {
int64_t cnt = lcm, prod = 1;
for (auto [a, b] : primes[i]) {
if (1 < p[a][b] || accumulate(begin(p[a]) + b + 1, end(p[a]), 0)) continue;
auto c = b - 1;
while (0 < c && p[a][c] == 0) --c;
prod *= mpow(a, b - c, mod);
cnt *= minv(mpow(a, b - c, mod), mod);
cnt %= mod;
}
if (removed < prod) {
removed = prod;
ans = cnt;
}
}
cout << ans << endl;
}
sten_san