結果
| 問題 |
No.2318 Phys Bone Maker
|
| コンテスト | |
| ユーザー |
amentorimaru
|
| 提出日時 | 2023-02-21 21:48:37 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 131 ms / 3,000 ms |
| コード長 | 1,352 bytes |
| コンパイル時間 | 704 ms |
| コンパイル使用メモリ | 81,964 KB |
| 最終ジャッジ日時 | 2025-02-10 19:51:36 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 45 |
ソースコード
#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()++;
else 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;
}
amentorimaru