結果
問題 |
No.2318 Phys Bone Maker
|
ユーザー |
![]() |
提出日時 | 2023-02-21 21:47:28 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,347 bytes |
コンパイル時間 | 951 ms |
コンパイル使用メモリ | 81,848 KB |
最終ジャッジ日時 | 2025-02-10 19:51:32 |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 WA * 1 |
other | AC * 41 WA * 4 |
ソースコード
#include<iostream> #include<vector> #include<unordered_map> using namespace std; using ll = long long; #define REP(i, n) for(ll i=0; i<(n);i++) ll mod = 998244353; vector<ll> c, dp; ll getind(vector<ll> & p) { ll res = 0; REP(i, c.size()) { res *= (c[i] + 1); res += p[i]; } return res; } void solve2(ll i, vector<ll>& ar, vector<ll>& mx, ll mul = 1) { if (i == c.size()) { ll imx = getind(mx); ll iar = getind(ar); if (imx == iar)return; dp[imx] += dp[iar] * mul; dp[imx] %= mod; return; } for (ar[i] = mx[i]; ar[i] >= 0; ar[i]--) solve2(i + 1, ar, mx, ar[i] != mx[i] ? mul : mul * (mx[i] + 1) % mod); } void solve(ll i, vector<ll>& ar) { if (i == c.size()) { vector<ll> ar2(c.size()); solve2(0, ar2, ar, 1); return; } for (ar[i] = 0; ar[i] <= c[i]; ar[i]++) solve(i + 1, ar); } int main() { ll n; cin >> n; ll rev = -1; while (1) { bool find = false; for (ll v = 2; v * v <= n; v++) { if (n % v)continue; if (rev == v)c.back()++; else c.push_back(1); n /= v; rev = v; find = true; break; } if (!find) { if (n == rev)c.back()++; c.push_back(1); break; } } dp.resize(getind(c) + 1); dp[0] = 1; vector<ll> ar(c.size()); solve(0, ar); cout << dp.back(); return 0; }