给定 T 个 64 位正整数 N ,保证 N = p \cdot q ,其中 p, q 均为 32 位无符号素数(即 2 \le p, q \le 2^{32} - 1 )。请对每个 N 输出其唯一的两个素因子 p 和 q ,要求 p \le q 。
第一行一个整数 T 。
接下来 T 行,每行一个十进制正整数 N 。
输出 T 行,每行两个整数 p 和 q ,以空格分隔, p \le q 。
3 15 21 143
3 5 3 7 11 13
对于全部数据: 1 \le T \le 10 , 4 \le N \le (2^{32} - 1)^2 \approx 1.85 \times 10^{19} , N = p \cdot q , p, q 为素数, 2 \le p, q \le 2^{32} - 1 。
当 p 与 q 都接近 2^{32} 时, N 接近 2^{64} ,普通乘法会溢出。必须用 __int128 实现 mulmod(a, b, n) = (__int128)a * b % n。Miller-Rabin 取 \{2, 325, 9375, 28178, 450775, 9780504, 1795265022\} 这 7 个底即可对 64 位整数完全确定。Pollard-Rho 用 Floyd/Brent 环检测, f(x) = x^2 + c \pmod N , \gcd(|x_i - x_j|, N) \in (1, N) 即得非平凡因子。最坏情形 p \approx q \approx \sqrt N ,对随机 c 多试几次即可在时限内命中。
__int128
mulmod(a, b, n) = (__int128)a * b % n