#include #include using i8 = std::int8_t; using i16 = std::int16_t; using i32 = std::int32_t; using i64 = std::int64_t; using i128 = __int128_t; using u8 = std::uint8_t; using u16 = std::uint16_t; using u32 = std::uint32_t; using u64 = std::uint64_t; using u128 = __uint128_t; template using vec = std::vector; template using vvec = std::vector>; template using vvvec = std::vector>>; templatebool chmax(T& a, const T& b) { if (a < b) { a = b; return 1; } return 0; } templatebool chmin(T& a, const T& b) { if (b < a) { a = b; return 1; } return 0; } template struct BarrettReduction { T m; T im; BarrettReduction() = default; explicit BarrettReduction(T m_) : m(m_), im((~T(0)) / m_) {} T get_mod() { return m; } std::pair div_rem(T a) { if (m == 1) return { a, 0 }; const T inv = im; T q = T((U(a) * U(inv)) >> __builtin_popcountll(T(~0))); T r = a - q * m; if (m <= r) { r -= m; q++; } return { q, r }; } T div(T a) { return div_rem(a).first; } T rem(T a) { return div_rem(a).second; } T pow(T a, T k) { T ret = T(1); T mul = a; while (k > 0) { if (k & 1) ret = rem(ret * mul); mul = rem(mul * mul); k >>= 1; } return ret; } }; bool miller_rabin(u64 n) { { if (n <= 1) return false; if (n <= 3) return true; if (!(n & 1)) return false; } BarrettReduction br(n); u64 m = n - 1; u64 d = m >> __builtin_ctzll(m); u64 base[] = { 2ul, 325ul, 9375ul, 28178ul, 450775ul, 9780504ul, 1795265022ul }; for (int i = 0; i < 7; ++i) { if (n <= base[i]) break; u64 t = d; u64 y = u64(br.pow(base[i], t)); while (t != m && y != 1 && y != m) { y = u64(br.rem(u128(y) * y)); t <<= 1; } if (y != m && (!(t & 1))) return false; } return true; } int main() { u64 Q; std::cin >> Q; while (Q--) { u64 x; std::cin >> x; std::cout << x << " "; std::cout << (miller_rabin(x) ? "1\n" : "0\n"); } }