結果
| 問題 |
No.3186 Big Order
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-06-21 01:17:44 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 3,042 bytes |
| コンパイル時間 | 9,845 ms |
| コンパイル使用メモリ | 500,500 KB |
| 実行使用メモリ | 16,068 KB |
| 最終ジャッジ日時 | 2025-06-21 01:17:58 |
| 合計ジャッジ時間 | 13,740 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 13 TLE * 1 -- * 20 |
ソースコード
#include <bits/stdc++.h>
#include <boost/multiprecision/cpp_int.hpp>
using namespace std;
using boost::multiprecision::cpp_int;
const cpp_int MOD = 998244353;
// --- 乗算 (cpp_int はオーバーフローしないのでそのまま) ---
inline cpp_int mul_mod(const cpp_int& a, const cpp_int& b, const cpp_int& mod) {
return (a * b) % mod;
}
// --- 素数判定(Miller–Rabin, deterministic for <= 2^128) ---
bool isPrime(const cpp_int& n) {
static const uint64_t smallPrimes[] = {
2,3,5,7,11,13,17,19,23,29,31,37
};
if (n < 2) return false;
for (uint64_t p : smallPrimes) {
if (n == p) return true;
if (n % p == 0) return false;
}
// n-1 = d * 2^s
cpp_int d = n - 1;
unsigned s = 0;
while ((d & 1) == 0) { d >>= 1; ++s; }
auto check = [&](uint64_t a) -> bool {
cpp_int x = boost::multiprecision::powm(cpp_int(a), d, n);
if (x == 1 || x == n - 1) return true;
for (unsigned r = 1; r < s; ++r) {
x = mul_mod(x, x, n);
if (x == n - 1) return true;
}
return false;
};
for (uint64_t a : smallPrimes) {
if (a >= n) break;
if (!check(a)) return false;
}
return true;
}
// --- Pollard–Rho ---
std::mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
cpp_int rho_f(const cpp_int& x, const cpp_int& c, const cpp_int& mod) {
return (mul_mod(x, x, mod) + c) % mod;
}
cpp_int pollard(const cpp_int& n) {
if ((n & 1) == 0) return 2;
while (true) {
cpp_int c = rng() % (n - 2) + 1;
cpp_int x = rng() % (n - 2) + 2;
cpp_int y = x;
cpp_int d = 1;
while (d == 1) {
x = rho_f(x, c, n);
y = rho_f(rho_f(y, c, n), c, n);
cpp_int diff = x > y ? x - y : y - x;
d = gcd(diff, n);
}
if (d != n) return d;
}
}
// --- 再帰的因数分解 ---
void factor(cpp_int n, std::map<cpp_int,int>& res) {
if (n == 1) return;
if (isPrime(n)) { ++res[n]; return; }
cpp_int d = pollard(n);
factor(d, res);
factor(n/d, res);
}
// --- v_p(A) を求める ---
int valuation(cpp_int a, const cpp_int& p) {
int cnt = 0;
while (a % p == 0) { a /= p; ++cnt; }
return cnt;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T; cin >> T;
while (T--) {
string sA, sB, sC; cin >> sA >> sB >> sC;
cpp_int A(sA), B(sB), C(sC);
// 素因数分解
map<cpp_int,int> fac;
factor(C, fac);
cpp_int ans = cpp_int(-1); // "∞" の代用
bool zero = false;
for (auto [p, e] : fac) {
int f = valuation(A, p); // f_i
if (f == 0) { zero = true; break; }
cpp_int tmp = cpp_int(f) * B; // B * f_i
cpp_int k = tmp / e; // floor
if (ans < 0 || k < ans) ans = k;
}
cpp_int out = (zero ? 0 : ans) % MOD;
cout << out << '\n';
}
return 0;
}