#include using uint = unsigned int; using ll = long long; using ull = unsigned long long; using ld = long double; using LL = __int128_t; using ULL = __uint128_t; template using max_heap = std::priority_queue; template using min_heap = std::priority_queue, std::greater>; template constexpr T inverse(const T a, const T mod) { return a == 1 ? T{1} : ((a - inverse(mod % a, a)) * mod + 1) / a; } template constexpr std::pair extgcd(const T a, const T b) { if (a == 0) { return -1 / b; } if (b == 0) { return 1 / a; } const T x = inverse(a, b), y = (a * x - 1) / b; return {x, y}; } template inline bool miller_rabin(const T& n, const std::vector& as) { auto pow = [&](auto&& self, const V& a, const T k) -> V { if (k == 0) { return 1; } if (k % 2 == 0) { return self(self, (a * a) % V(n), k / 2); } else { return (self(self, a, k - 1) * a) % V(n); } }; T d = n - 1; for (; (d & 1) == 0; d >>= 1) {} for (const T& a : as) { if (n <= a) { break; } T s = d; V x = pow(pow, a, s); while (x != 1 and x != n - 1 and s != n - 1) { (x *= x) %= V(n); s *= 2; } if (x != n - 1 and s % 2 == 0) { return false; } } return true; } inline bool is_prime(const ull n) { if (n % 2 == 0) { return n == 2; } if (n < (1ULL << 32)) { return miller_rabin((uint)n, std::vector{2, 7, 61}); } else { return miller_rabin(n, std::vector{2, 325, 9375, 28178, 450775, 9780504}); } } template T pollard_rho(const T n) { if (n % 2 == 0) { return 2; } if (is_prime(n)) { return n; } for (T c = 1; c < n; c++) { if (c == n - 2) { continue; } auto f = [&](const T x) -> T { return T((V(x) * V(x) + V(c)) % V(n)); }; T x = 2, y = 2, d = 1; while (d == 1) { x = f(x), y = f(f(y)); d = std::gcd(std::max(x, y) - std::min(x, y), n); } if (d != n) { return d; } } return n; } std::map prime_factors(const ull n_) { std::map ans; auto factor = [&](auto&& self, const ull n) -> void { if (n == 1) { return; } const ull p = (n < (1ULL << 32)) ? (ull)pollard_rho((uint)n) : pollard_rho(n); if (p == n) { ans[p]++; return; } self(self, p), self(self, n / p); }; factor(factor, n_); return ans; } template mint mod_nthroot(mint A, ull k) { const ull P = mint::mod; const ull PMAX = std::pow(P, 0.25); if (A == 0) { return 0; } if (k == 0) { return A; } const ull g = std::gcd(P - 1, k); if (A.pow((P - 1) / g)() != 1) { return 0; } A = A.pow(inverse(k / g, (P - 1) / g)); if (g == 1) { return A; } const auto fs = prime_factors(g); for (const auto& [p, e] : fs) { if (p > 2 * PMAX) { break; } ull pe = 1; for (int i = 0; i < e; i++) { pe *= p; } ull q = P - 1, Q = 0; while (q % p == 0) { q /= p, Q++; } mint Eraser = 1; const ull h = (P - 1) / p; for (mint Z = 2;; Z += 1) { if (Z.pow(h) != 1) { Eraser = Z.pow(q); break; } } const ull y = pe - inverse(q, pe), z = ((ULL)y * q + 1) / (ULL)pe; mint Error = A.pow((ULL)y * q); mint pEraser = Eraser; for (ull i = 0; i < Q - 1; i++) { pEraser = pEraser.pow(p); } const mint ipEraser = pEraser.inv(); const ull M = std::max(1ULL, (ull)(std::sqrt(p) * std::sqrt(q - e))), B = std::max(1ULL, ((ull)p - 1) / M); std::map memo; { const mint ppEraser = pEraser.pow(B); mint prod = 1; for (ull i = 0; i < p; i += B, prod *= ppEraser) { if (memo[prod()]) { break; } memo[prod()] = i; } } mint X = A.pow(z); while (Error() != 1) { ull l = 0; mint pError = Error; for (ull i = 0; i < Q; i++) { const auto npError = pError.pow(p); if (npError == 1) { l = Q - (i + 1); break; } pError = npError; } ull c = -1; { mint small = pError.inv(); for (ull j = 0; j < B; j++, small *= ipEraser) { if (memo.count(small())) { const ull i = memo.at(small()); c = i + j; break; } } } auto pEraser2 = Eraser.pow(c); for (ull i = 0; i < l - e; i++) { pEraser2 = pEraser2.pow(p); } X *= pEraser2, Error *= pEraser2.pow(pe); } A = X; } return A; } struct modinfo { constexpr modinfo(const uint mod_, const uint root_, const uint max2p_) : mod{mod_}, root{root_}, max2p{max2p_} {} constexpr modinfo() : mod{}, root{}, max2p{} {} void set_mod(const uint mod_) { mod = mod_; } void set_root(const uint root_) { root = root_; } void set_max2p(const uint max2p_) { max2p = max2p_; } uint mod, root, max2p; }; template class modint { public: static constexpr const uint& mod = info.mod; static constexpr const uint& root = info.root; static constexpr const uint& max2p = info.max2p; constexpr modint() : m_val{0} {} constexpr modint(const ll v) : m_val{normll(v)} {} constexpr modint(const modint& m) = default; constexpr void set_raw(const uint v) { m_val = v; } constexpr modint& operator=(const modint& m) { return m_val = m(), (*this); } constexpr modint& operator=(const ll v) { return m_val = normll(v), (*this); } constexpr modint operator+() const { return *this; } constexpr modint operator-() const { return modint{0} - (*this); } constexpr modint& operator+=(const modint& m) { return m_val = norm(m_val + m()), *this; } constexpr modint& operator-=(const modint& m) { return m_val = norm(m_val + mod - m()), *this; } constexpr modint& operator*=(const modint& m) { return m_val = normll((ll)m_val * (ll)m() % (ll)mod), *this; } constexpr modint& operator/=(const modint& m) { return *this *= m.inv(); } constexpr modint& operator+=(const ll val) { return *this += modint{val}; } constexpr modint& operator-=(const ll val) { return *this -= modint{val}; } constexpr modint& operator*=(const ll val) { return *this *= modint{val}; } constexpr modint& operator/=(const ll val) { return *this /= modint{val}; } constexpr modint operator+(const modint& m) const { return modint{*this} += m; } constexpr modint operator-(const modint& m) const { return modint{*this} -= m; } constexpr modint operator*(const modint& m) const { return modint{*this} *= m; } constexpr modint operator/(const modint& m) const { return modint{*this} /= m; } constexpr modint operator+(const ll v) const { return *this + modint{v}; } constexpr modint operator-(const ll v) const { return *this - modint{v}; } constexpr modint operator*(const ll v) const { return *this * modint{v}; } constexpr modint operator/(const ll v) const { return *this / modint{v}; } constexpr bool operator==(const modint& m) const { return m_val == m(); } constexpr bool operator!=(const modint& m) const { return not(*this == m); } constexpr friend modint operator+(const ll v, const modint& m) { return modint{v} + m; } constexpr friend modint operator-(const ll v, const modint& m) { return modint{v} - m; } constexpr friend modint operator*(const ll v, const modint& m) { return modint{v} * m; } constexpr friend modint operator/(const ll v, const modint& m) { return modint{v} / m; } friend std::istream& operator>>(std::istream& is, modint& m) { ll v; return is >> v, m = v, is; } friend std::ostream& operator<<(std::ostream& os, const modint& m) { return os << m(); } constexpr uint operator()() const { return m_val; } constexpr modint pow(ull n) const { modint ans = 1; for (modint x = *this; n > 0; n >>= 1, x *= x) { if (n & 1ULL) { ans *= x; } } return ans; } constexpr modint inv() const { return pow(mod - 2); } modint sinv() const { return sinv(m_val); } static modint fact(const uint n) { static std::vector fs{1, 1}; for (uint i = (uint)fs.size(); i <= n; i++) { fs.push_back(fs.back() * i); } return fs[n]; } static modint ifact(const uint n) { static std::vector ifs{1, 1}; for (uint i = (uint)ifs.size(); i <= n; i++) { ifs.push_back(ifs.back() * sinv(i)); } return ifs[n]; } static modint perm(const int n, const int k) { return k > n or k < 0 ? modint{0} : fact(n) * ifact(n - k); } static modint comb(const int n, const int k) { return k > n or k < 0 ? modint{0} : fact(n) * ifact(n - k) * ifact(k); } private: static constexpr uint norm(const uint x) { return x < mod ? x : x - mod; } static constexpr uint normll(const ll x) { return norm(uint(x % (ll)mod + (ll)mod)); } static modint sinv(const uint n) { static std::vector is{1, 1}; for (uint i = (uint)is.size(); i <= n; i++) { is.push_back(-is[mod % i] * (mod / i)); } return is[n]; } uint m_val; }; constexpr modinfo modinfo_1000000007 = {1000000007, 5, 1}; constexpr modinfo modinfo_998244353 = {998244353, 3, 23}; using modint_1000000007 = modint; using modint_998244353 = modint; struct modinfo64 { constexpr modinfo64() : mod{} {} constexpr modinfo64(const ull mod_) : mod{mod_} {} void set_mod(const ull mod_) { mod = mod_; } ull mod; }; template class modint64 { public: static constexpr const ull& mod = info.mod; constexpr modint64() : m_val{0} {} constexpr modint64(const ll v) : m_val{normll(v)} {} constexpr modint64(const modint64& m) = default; constexpr void set_raw(const ull v) { m_val = v; } constexpr modint64& operator=(const modint64& m) { return m_val = m(), (*this); } constexpr modint64& operator=(const ll v) { return m_val = normll(v), (*this); } constexpr modint64 operator+() const { return *this; } constexpr modint64 operator-() const { return modint64{0} - (*this); } constexpr modint64& operator+=(const modint64& m) { return m_val = norm(m_val + m()), *this; } constexpr modint64& operator-=(const modint64& m) { return m_val = norm(m_val + mod - m()), *this; } constexpr modint64& operator*=(const modint64& m) { return m_val = normll((LL)m_val * (LL)m() % (LL)mod), *this; } constexpr modint64& operator/=(const modint64& m) { return *this *= m.inv(); } constexpr modint64& operator+=(const ll val) { return *this += modint64{val}; } constexpr modint64& operator-=(const ll val) { return *this -= modint64{val}; } constexpr modint64& operator*=(const ll val) { return *this *= modint64{val}; } constexpr modint64& operator/=(const ll val) { return *this /= modint64{val}; } constexpr modint64 operator+(const modint64& m) const { return modint64{*this} += m; } constexpr modint64 operator-(const modint64& m) const { return modint64{*this} -= m; } constexpr modint64 operator*(const modint64& m) const { return modint64{*this} *= m; } constexpr modint64 operator/(const modint64& m) const { return modint64{*this} /= m; } constexpr modint64 operator+(const ll v) const { return *this + modint64{v}; } constexpr modint64 operator-(const ll v) const { return *this - modint64{v}; } constexpr modint64 operator*(const ll v) const { return *this * modint64{v}; } constexpr modint64 operator/(const ll v) const { return *this / modint64{v}; } constexpr bool operator==(const modint64& m) const { return m_val == m(); } constexpr bool operator!=(const modint64& m) const { return not(*this == m); } constexpr friend modint64 operator+(const ll v, const modint64& m) { return modint64{v} + m; } constexpr friend modint64 operator-(const ll v, const modint64& m) { return modint64{v} - m; } constexpr friend modint64 operator*(const ll v, const modint64& m) { return modint64{v} * m; } constexpr friend modint64 operator/(const ll v, const modint64& m) { return modint64{v} / m; } friend std::istream& operator>>(std::istream& is, modint64& m) { ll v; return is >> v, m = v, is; } friend std::ostream& operator<<(std::ostream& os, const modint64& m) { return os << m(); } constexpr ull operator()() const { return m_val; } constexpr modint64 pow(ULL n) const { modint64 ans = 1; for (modint64 x = *this; n > 0; n >>= 1, x *= x) { if (n & ULL{1}) { ans *= x; } } return ans; } constexpr modint64 inv() const { return pow(mod - 2); } modint64 sinv() const { return sinv(m_val); } static modint64 fact(const uint n) { static std::vector fs{1, 1}; for (uint i = (uint)fs.size(); i <= n; i++) { fs.push_back(fs.back() * i); } return fs[n]; } static modint64 ifact(const uint n) { static std::vector ifs{1, 1}; for (uint i = (uint)ifs.size(); i <= n; i++) { ifs.push_back(ifs.back() * sinv(i)); } return ifs[n]; } static modint64 perm(const int n, const int k) { return k > n or k < 0 ? modint64{0} : fact(n) * ifact(n - k); } static modint64 comb(const int n, const int k) { return k > n or k < 0 ? modint64{0} : fact(n) * ifact(n - k) * ifact(k); } private: static constexpr ull norm(const ull x) { return x < mod ? x : x - mod; } static constexpr ull normll(const ll x) { return norm(ull(x % (ll)mod + (ll)mod)); } static modint64 sinv(const uint n) { static std::vector is{1, 1}; for (uint i = (uint)is.size(); i <= n; i++) { is.push_back(-is[mod % i] * (mod / i)); } return is[n]; } ull m_val; }; class printer { public: printer() { for (int i = 0; i < 10000; i++) { for (int j = i, t = 3; t >= 0; t--, j /= 10) { m_dict[i * 4 + t] = (j % 10) + '0'; } } } ~printer() { flush(); } template int ln(const Args&... args) { return dump(args...), put_char('\n'), 0; } template int el(const Args&... args) { return dump(args...), put_char('\n'), flush(), 0; } private: using ll = long long; using ull = unsigned long long; static constexpr ull TEN(const int d) { return d == 0 ? 1ULL : TEN(d - 1) * 10ULL; } void flush() { fwrite(m_memory, 1, m_tail, stdout), m_tail = 0; } void put_char(const char c) { m_memory[m_tail++] = c; } static constexpr int dn(const ull x) { return x < TEN(10) ? x < TEN(5) ? x < TEN(2) ? x < TEN(1) ? 1 : 2 : x < TEN(3) ? 3 : x < TEN(4) ? 4 : 5 : x < TEN(7) ? x < TEN(6) ? 6 : 7 : x < TEN(8) ? 8 : x < TEN(9) ? 9 : 10 : x < TEN(14) ? x < TEN(12) ? x < TEN(11) ? 11 : 12 : x < TEN(13) ? 13 : 14 : x < TEN(16) ? x < TEN(15) ? 15 : 16 : x < TEN(17) ? 17 : x < TEN(18) ? 18 : 19; } template void dump(T v) { if (C - m_tail < 50) { flush(); } if (v < 0) { put_char('-'), v = -v; } const auto d = dn(v); int i = d - 4; for (i = d - 4; i >= 0; i -= 4, v /= 10000) { memcpy(m_memory + m_tail + i, m_dict + (v % 10000) * 4, 4); } memcpy(m_memory + m_tail, m_dict + v * 4 - i, i + 4); m_tail += d; } template void dump(const std::vector& vs) { for (int i = 0; i < (int)vs.size(); i++) { if (i > 0) { put_char(' '); } dump(vs[i]); } } template void dump(const std::vector>& vss) { for (int i = 0; i < (int)vss.size(); i++) { if (i > 0) { put_char('\n'); } dump(vss[i]); } } template void dump(const T& v, const Args&... args) { return dump(v), put_char(' '), dump(args...), void(0); } static constexpr int C = 1 << 18; int m_tail = 0; char m_memory[C]; char m_dict[10000 * 4]; } out; class scanner { public: scanner() {} template T val() { if (m_tail - m_head < 40) { disk_read(); } char c = get_char(); const bool neg = (c == '-'); if (neg) { c = get_char(); } T ans = 0; while (c >= '0') { ans = ans * T{10} + (c - '0'); c = get_char(); } return (neg ? -ans : ans); } template T val(const T offset) { return val() - offset; } template std::vector vec(const int n) { return make_v(n, [this]() { return val(); }); } template std::vector vec(const int n, const T offset) { return make_v(n, [this, offset]() { return val(offset); }); } template std::vector> vvec(const int n0, const int n1) { return make_v>(n0, [this, n1]() { return vec(n1); }); } template std::vector> vvec(const int n0, const int n1, const T offset) { return make_v>(n0, [this, n1, offset]() { return vec(n1, offset); }); } template auto tup() { return std::tuple...>{val()...}; } template auto tup(const Args&... offsets) { return std::tuple...>{val(offsets)...}; } private: template std::vector make_v(const int n, F f) { std::vector ans; for (int i = 0; i < n; i++) { ans.push_back(f()); } return ans; } char get_char() { return m_memory[m_head++]; } void disk_read() { std::copy(m_memory + m_head, m_memory + m_tail, m_memory); m_tail -= m_head, m_head = 0; m_tail += fread(m_memory + m_tail, 1, C - m_tail, stdin); } static constexpr int C = 1 << 18; int m_head = 0, m_tail = 0; char m_memory[C]; } in; constexpr int popcount(const ull v) { return v ? __builtin_popcountll(v) : 0; } constexpr int log2p1(const ull v) { return v ? 64 - __builtin_clzll(v) : 0; } constexpr int lsbp1(const ull v) { return __builtin_ffsll(v); } constexpr int clog(const ull v) { return v ? log2p1(v - 1) : 0; } constexpr ull ceil2(const ull v) { return 1ULL << clog(v); } constexpr ull floor2(const ull v) { return v ? (1ULL << (log2p1(v) - 1)) : 0ULL; } constexpr bool btest(const ull mask, const int ind) { return (mask >> ind) & 1ULL; } template class rng_base { public: using result_type = typename Rng::result_type; static constexpr result_type min() { return Rng::min(); } static constexpr result_type max() { return Rng::max(); } rng_base() : rng_base(std::random_device{}()) {} rng_base(const std::random_device::result_type seed) : m_rng(seed) {} ~rng_base() = default; result_type operator()() { return m_rng(); } result_type val(const result_type max = std::numeric_limits::max()) { if (max == std::numeric_limits::max()) { return m_rng(); } const result_type mask = ceil2(max + 1) - 1; while (true) { const result_type ans = m_rng() & mask; if (ans <= max) { return ans; } } } template T val(const T min, const T max) { return min + T(val(max - min)); } operator bool() { return val(0, 1); } template std::pair pair(const T min, const T max) { return std::minmax(val(min, max), val(min, max)); } template std::vector vec(const int n, const T min, const T max) { std::vector vs(n); for (auto& v : vs) { v = val(min, max); } return vs; } private: Rng m_rng; }; rng_base rng; rng_base rng64; modinfo info; using mint = modint; modinfo64 info64; using mint64 = modint64; int main() { const int T = in.val(); for (int t = 0; t < T; t++) { const auto [P, K, A] = in.tup(); if (P < (1ULL << 31)) { info.set_mod(P); const mint ans = mod_nthroot(mint{(ll)A}, K); if (ans.pow(K) == A) { out.ln(ans()); } else { out.ln(-1); } } else { info64.set_mod(P); const mint64 ans = mod_nthroot(mint64{(ll)A}, K); if (ans.pow(K) == A) { out.ln(ans()); } else { out.ln(-1); } } } return 0; }