ll qmi(ll a, ll b, ll c) { ll res = 1, base = a; while (b) { if (b & 1) res = (lll)res * base % c; base = (lll)base * base % c; b >>= 1; } return res; }
bool MillerRabin(ll n) { if (n == 2) return true; if (n < 2 || !(n & 1)) return false; ll t = n - 1, k = 0; while (!(t & 1)) k++, t >>= 1; for (int i = 0; i < 8; ++i) { if (n == prime[i]) return true; ll a = qmi(prime[i], t, n), temp = a; for (int j = 1; j <= k; ++j) { temp = (lll)a * a % n; if (temp == 1 && a != 1 && a != n - 1) return false; a = temp; } if (a != 1) return false; } return true; }
ll gcd(ll a, ll b) { if (b == 0) return a; return gcd(b, a % b); }
ll f(ll x, ll c, ll n) { return ((lll)x * x + c) % n; }
ll Pollard_Rho(ll x) { ll s = 0, t = 0, c = (ll)rand() % (x - 1) + 1; int step = 0, goal = 1; ll val = 1; for (goal = 1; ; goal <<= 1, s = t, val = 1) { for (step = 1; step <= goal; ++step) { t = f(t, c, x); val = (lll)val * abs(t - s) % x; if (step % 127 == 0) { ll d = gcd(val, x); if (d > 1) return d; } } ll d = gcd(val, x); if (d > 1) return d; } }
void find(ll x) { if (x <= max_factor || x < 2) return; if (MillerRabin(x)) { max_factor = max_factor > x ? max_factor : x; return; } ll p = x; while (p >= x) p = Pollard_Rho(x); while (x % p == 0) x /= p; find(x), find(p); }
int main() { int T; scanf("%d", &T); while (T--) { srand((unsigned)time(0)); ll n; scanf("%lld", &n); max_factor = 0; find(n); if (max_factor == n) printf("Prime\n"); else printf("%lld\n", max_factor); } return 0; }