結果
| 問題 |
No.2318 Phys Bone Maker
|
| コンテスト | |
| ユーザー |
👑 tatyam
|
| 提出日時 | 2023-03-15 03:14:12 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,460 bytes |
| コンパイル時間 | 991 ms |
| コンパイル使用メモリ | 100,284 KB |
| 実行使用メモリ | 6,948 KB |
| 最終ジャッジ日時 | 2024-09-18 12:59:08 |
| 合計ジャッジ時間 | 6,003 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 TLE * 1 |
| other | AC * 42 TLE * 3 |
ソースコード
#include <cstdint>
#include <iostream>
#include <vector>
#include <atcoder/modint>
using namespace std;
using u64 = uint64_t;
using Modint = atcoder::modint998244353;
u64 binary_gcd(u64 x, u64 y) {
if (!x or !y) return x + y;
int n = __builtin_ctzll(x), m = __builtin_ctzll(y);
x >>= n; y >>= m;
while (x != y) {
if (x > y) {
x = (x - y) >> __builtin_ctzll(x - y);
} else {
y = (y - x) >> __builtin_ctzll(y - x);
}
}
return x << (n > m ? m : n);
}
int main() {
u64 N;
cin >> N;
auto divisor = [&]{
vector<u64> divisor, divisor2;
for(u64 d = 1; d * d <= N; d++) if(N % d == 0) {
divisor.push_back(d);
divisor2.push_back(N / d);
}
if(divisor.back() == divisor2.back()) divisor2.pop_back();
divisor.insert(divisor.end(), divisor2.rbegin(), divisor2.rend());
return divisor;
}();
auto press = [&](u64 x) {
return lower_bound(divisor.begin(), divisor.end(), x) - divisor.begin();
};
vector<Modint> dp(divisor.size());
dp[0] = 1;
for(int i = 0; i < divisor.size(); i++) {
const u64 A = divisor[i];
for(u64 B : divisor) {
const u64 GCD = binary_gcd(A, B);
if(GCD == B) continue;
const u64 LCM = A / GCD * B;
dp[press(LCM)] += dp[i];
}
}
cout << dp.back().val() << endl;
}
tatyam