from math import gcd import random max_d = 132 def is_prime(n): d = n - 1 s = 0 while d % 2 == 0: d //= 2 s += 1 for b in [2, 325, 9375, 28178, 450775, 9780504, 1795265022]: if n <= b: return True p = pow(b, d, n) if p == 1: continue for _ in range(s): if p == n - 1: break p = p * p % n else: return False return True def rho(n): d = random.randint(1, n - 1) def f(x): return (x * x + d) % n x = 1 y = 1 while True: x = f(x) y = f(f(y)) d = gcd(abs(x - y), n) if d > 1: return d if d == n: return None def factor(n): if n < 2: return [] if n % 2 == 0: return [2] + factor(n // 2) if is_prime(n): return [n] while True: d = rho(n) if d is None: continue return factor(d) + factor(n // d) def solve(): a, b, c = map(int, input().split()) assert 1 <= a <= 10 ** 40 assert 1 <= b <= 10 ** 40 assert 2 <= c <= 10 ** 40 factor(gcd(a, c)) def check(p, q): return a ** p % c ** q == 0 if not check(max_d, 1): print(0) return def search(): l = 0, 1 u = 1, 0 while True: now = check(l[0] + u[0], l[1] + u[1]) f = u if now else l t = l if now else u k = 1 while check(f[0] + k * 2 * t[0], f[1] + k * 2 * t[1]) == now: k *= 2 if max(f[0] + k * t[0], f[1] + k * t[1]) > max_d: return t ok = k ng = k * 2 while ok + 1 < ng: mid = (ok + ng) // 2 if check(f[0] + mid * t[0], f[1] + mid * t[1]) == now: ok = mid else: ng = mid f = f[0] + ok * t[0], f[1] + ok * t[1] if now: u = f else: l = f p, q = search() print(b * q // p % 998244353) t = int(input()) assert 1 <= t <= 100 for _ in range(t): solve()