This documentation is automatically generated by online-judge-tools/verification-helper
floor(a^(1/k)) を求める。
二分探索で整数解を絞る。
ull kth_root_integer(ull a, int k)
floor(a^(1/k)) を返す0 <= a < 2^64, 1 <= k を想定する。
内部では x^k <= a を __int128 で判定する。
bool kth_root_integer_leq(ull x, int k, ull a) {
__uint128_t p = 1;
for (int i = 0; i < k; ++i) {
p *= x;
if (p > a) return false;
}
return true;
}
ull kth_root_integer(ull a, int k) {
if (k == 1 || a <= 1) return a;
ull ng = min<ull>(a, (1ULL << 32)) + 1, ok = 0;
while (ng - ok > 1) {
ull mid = ok + (ng - ok) / 2;
if (kth_root_integer_leq(mid, k, a)) ok = mid;
else ng = mid;
}
return ok;
}
/**
* @brief 整数k乗根(K-th Root Integer)
*/#line 1 "math/kth_root_integer.cpp"
bool kth_root_integer_leq(ull x, int k, ull a) {
__uint128_t p = 1;
for (int i = 0; i < k; ++i) {
p *= x;
if (p > a) return false;
}
return true;
}
ull kth_root_integer(ull a, int k) {
if (k == 1 || a <= 1) return a;
ull ng = min<ull>(a, (1ULL << 32)) + 1, ok = 0;
while (ng - ok > 1) {
ull mid = ok + (ng - ok) / 2;
if (kth_root_integer_leq(mid, k, a)) ok = mid;
else ng = mid;
}
return ok;
}
/**
* @brief 整数k乗根(K-th Root Integer)
*/