結果
| 問題 |
No.2318 Phys Bone Maker
|
| コンテスト | |
| ユーザー |
👑 tatyam
|
| 提出日時 | 2023-05-02 23:04:34 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 118 ms / 3,000 ms |
| コード長 | 1,691 bytes |
| コンパイル時間 | 1,050 ms |
| コンパイル使用メモリ | 96,724 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-11-21 10:50:23 |
| 合計ジャッジ時間 | 3,443 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 45 |
ソースコード
#include <iostream>
#include <vector>
#include <atcoder/modint>
using namespace std;
using ll = long long;
using mint = atcoder::modint998244353;
int main() {
ll N;
cin >> N;
vector<int> factor;
{ // 素因数分解
for(ll p = 2; p * p <= N; p++) if(N % p == 0) {
N /= p;
factor.push_back(1);
while(N % p == 0) {
N /= p;
factor.back()++;
}
}
if(N > 1) factor.push_back(1);
}
const int size = [&]{
int size = 1;
for(int f : factor) size *= f + 1;
return size;
}();
vector<mint> dp(size);
auto at = [&](vector<int> index) -> mint& {
int i = 0;
for(int k = 0; k < factor.size(); k++) {
i *= factor[k] + 1;
i += index[k];
}
return dp[i];
};
dp[0] = 1;
auto next_index = [&](vector<int>& index, const vector<int>& zero) {
for(int k = factor.size(); ; ) {
if(--k < 0) {
index.clear();
return;
}
if(index[k] == factor[k]) {
index[k] = zero[k];
continue;
}
index[k]++;
return;
}
};
const vector<int> zero(factor.size(), 0);
for(auto I = zero; I.size(); next_index(I, zero)) {
const mint dp1 = at(I);
for(auto J = I; (void)next_index(J, I), J.size(); ) {
mint x = dp1;
for(int k = 0; k < factor.size(); k++) {
if(J[k] == I[k]) x *= mint::raw(I[k] + 1);
}
at(J) += x;
}
}
cout << dp.back().val() << endl;
}
tatyam