結果
問題 |
No.2318 Phys Bone Maker
|
ユーザー |
|
提出日時 | 2023-05-30 14:21:24 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,614 ms / 3,000 ms |
コード長 | 1,800 bytes |
コンパイル時間 | 2,215 ms |
コンパイル使用メモリ | 209,628 KB |
最終ジャッジ日時 | 2025-02-13 16:31:31 |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 45 |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; unordered_map<ll, ll> mp, mp_cn; unordered_map<ll, vector<ll>> ss_cnt; std::vector<ll> sosu; ll m = 998244353; ll cnt_yk(ll a){ if (mp_cn.find(a) != mp_cn.end()) { return mp_cn[a]; } if (a == 1) { return mp_cn[a] = 1; } mp_cn[a] = 0; for (ll i = 1; i * i <= a; i ++) { if (a % i == 0) { mp_cn[a] ++; if (i * i < a) { mp_cn[a] ++; } } } return mp_cn[a]; } ll calc(ll a) { if (mp.find(a) != mp.end()) { return mp[a]; } mp[a] = 0; for (ll i = 1; i * i <= a; i ++) { if (a % i == 0) { ll kj = calc(i); for (int j = 0; j < sosu.size(); j ++) { if (ss_cnt[i][j] == ss_cnt[a][j]) { kj *= (ss_cnt[a][j] + 1); kj %= m; } } mp[a] += kj; if (i * i < a && i > 1) { ll b = a / i; ll kj = calc(b); for (int j = 0; j < sosu.size(); j ++) { if (ss_cnt[b][j] == ss_cnt[a][j]) { kj *= (ss_cnt[a][j] + 1); kj %= m; } } mp[a] += kj; } mp[a] %= m; } } return mp[a]; } int main() { ll N; cin >> N; mp[1] = 1; ll n = N; for (ll i = 2; i * i <= N; i ++) { if (n < i) break; if (n % i == 0) { sosu.push_back(i); while (n % i == 0) { n /= i; } } } if (n > 1) { sosu.push_back(n); } for (ll i = 1; i * i <= N; i ++) { if (N % i == 0) { ss_cnt[i] = sosu; ll j = i; for (int p = 0; p < sosu.size(); p ++) { ss_cnt[i][p] = 0; ll q = sosu[p]; while (j % q == 0) { ss_cnt[i][p] ++; j /= q; } } if (i * i < N) { ll a = N / i; ss_cnt[a] = sosu; ll j = a; for (int p = 0; p < sosu.size(); p ++) { ss_cnt[a][p] = 0; ll q = sosu[p]; while (j % q == 0) { ss_cnt[a][p] ++; j /= q; } } } } } cout << calc(N) << endl; }