#Pollard Rho def quick_power(x , y , p) : ret = 1 while y != 0 : if y % 2 == 1 : ret *= x ret %= p x *= x x %= p y //= 2 return ret def miller_rabin(x , n) : cnt = 0 m = n - 1 while m % 2 == 0 : cnt += 1 m //= 2 x = quick_power(x , m , n) if x == 1 : return True while cnt : cnt -= 1 if x == 1 : return False if x == n - 1 : return True x *= x x %= n return x == 1 def is_prime(x) : if x == 2 or x == 3 or x == 5 or x == 7 or x == 11 or x == 13 or x == 17 or x == 19 or x == 23 or x == 29 or x == 31 or x == 37 : return True if x == 1 or x % 2 == 0 : return False i = 2 while i <= 37 : if not miller_rabin(i , x) : return False i += 1 return True def gcd(x , y) : if y == 0 : return x return gcd(y , x % y) def F(n , p , c) : return (n * n + c) % p seed = 19260817 def rand() : seed += seed * 131072 seed += seed // 32 seed += seed * 4096 seed %= 4294967296 return seed def random(n) : return rand() % n def iabs(x) : if x >= 0 : return x else : return -x def pollard_rho(n) : #print ("try" , n) if n == 1 : return if is_prime(n) : print(n) return while True : c , p = random(n - 1) + 1 , random(n - 1) + 1 q = F(p , n , c) while p != q : g = gcd(iabs(p - q) , n) if g != 1 and g != n : pollard_rho(g) pollard_rho(n // g) return p , q = F(p , n , c) , F(F(q , n , c) , n , c) pollard_rho(998244352) print() pollard_rho(809172) print() pollard_rho(151299083768042202434037960)