結果
問題 | No.1529 Constant Lcm |
ユーザー |
|
提出日時 | 2021-06-04 20:48:24 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,126 ms / 3,000 ms |
コード長 | 2,847 bytes |
コンパイル時間 | 958 ms |
コンパイル使用メモリ | 84,532 KB |
実行使用メモリ | 10,916 KB |
最終ジャッジ日時 | 2024-11-19 10:22:08 |
合計ジャッジ時間 | 13,243 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 24 |
ソースコード
#include <iostream>#include <vector>#include <algorithm>#include <map>using namespace std;template<const int MOD> struct modint{long long val;modint(): val(0) {}modint(long long x){if(x < 0) val = x % MOD + MOD;else val = x % MOD;}modint(const modint &t){val = t.val;}modint& operator =(const modint m){val = m.val;return *this;}modint operator -(){return modint(-val);}modint& operator-=(const modint &m){val -= m.val;if(val < 0) val += MOD;return *this;}modint& operator+=(const modint &m){val += m.val;if(val >= MOD) val -= MOD;return *this;}modint& operator*=(const modint &m){val *= m.val;val %= MOD;return *this;}modint& operator/=(modint m){*this *= m.inv();return *this;}modint inv(){long long x = 1, y = 0;long long a = val, b = MOD;while(b != 0){long long t = a / b;a -= t * b;x -= t * y;swap(a, b);swap(x, y);}x %= MOD;if(x < 0) x += MOD;return modint(x);}modint pow(long long k){long long res = 1;long long v = val;while(k > 0){if(k & 1) res = res * v % MOD;v = v * v % MOD;k >>= 1;}return modint(res);}modint operator==(const modint &m){return val == m.val;}modint operator+(const modint &m){return modint(*this) += m;}modint operator-(const modint &m){return modint(*this) -= m;}modint operator*(const modint &m){return modint(*this) *= m;}modint operator/(const modint &m){return modint(*this) /= m;}bool operator!=(const modint &m){return modint(*this).val != m.val;}bool operator!=(const int &m){return modint(*this).val != m;}};const int MOD = 998244353;using mint = modint<MOD>;int main(){int N;cin >> N;vector<int> fac(1000010, -1);fac[1] = 1;for(int i = 2; i < 1000010; i++){if(fac[i] != -1) continue;int t = i;while(t < 1000010){fac[t] = i;t += i;}}map<int, int> m;for(int i = 1; i < N; i++){map<int, int> t;for(int j = i; j != 1; j /= fac[j]){t[fac[j]]++;}for(int j = N - i; j != 1; j /= fac[j]){t[fac[j]]++;}for(auto v: t){m[v.first] = max(m[v.first], v.second);}}mint ans = 1;for(auto v: m){mint t = v.first;ans *= t.pow(v.second);}cout << ans.val << endl;}