結果
問題 |
No.577 Prime Powerful Numbers
|
ユーザー |
![]() |
提出日時 | 2025-06-12 14:03:31 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 4,408 bytes |
コンパイル時間 | 323 ms |
コンパイル使用メモリ | 82,388 KB |
実行使用メモリ | 130,420 KB |
最終ジャッジ日時 | 2025-06-12 14:04:30 |
合計ジャッジ時間 | 6,716 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | -- * 1 |
other | TLE * 1 -- * 9 |
ソースコード
import sys import math def sieve(max_limit): sieve = [True] * (max_limit + 1) sieve[0] = sieve[1] = False for i in range(2, int(math.sqrt(max_limit)) + 1): if sieve[i]: sieve[i*i : max_limit+1 : i] = [False] * len(sieve[i*i : max_limit+1 : i]) primes = [i for i, is_p in enumerate(sieve) if is_p] return sieve, primes sieve_limit = 10**6 is_prime_sieve, primes_list = sieve(sieve_limit) def is_prime(n): if n <= sieve_limit: return is_prime_sieve[n] d = n - 1 s = 0 while d % 2 == 0: d //= 2 s += 1 for a in [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]: if a >= n: continue x = pow(a, d, n) if x == 1 or x == n - 1: continue for _ in range(s - 1): x = pow(x, 2, n) if x == n - 1: break else: return False return True def integer_nth_root(y, k): if y < 0: return 0 if y == 0: return 0 low = 1 high = y while low <= high: mid = (low + high) // 2 try: temp = pow(mid, k) except OverflowError: high = mid - 1 continue if temp == y: return mid elif temp < y: low = mid + 1 else: high = mid - 1 return high def is_prime_power(y): if y <= 1: return False if is_prime(y): return True max_k = y.bit_length() for k in range(max_k, 1, -1): if k > y.bit_length(): continue root = integer_nth_root(y, k) if root == 0 or root == 1: continue if pow(root, k) != y: continue if is_prime(root): return True return False def solve(): Q = int(sys.stdin.readline()) for _ in range(Q): N = int(sys.stdin.readline()) found = False for a in range(3, 61): max_p = integer_nth_root(N, a) if max_p < 2: continue for p in range(2, max_p + 1): if p <= sieve_limit and not is_prime_sieve[p]: continue if p > sieve_limit and not is_prime(p): continue x = pow(p, a) if x > N: break y = N - x if y <= 0: continue if is_prime_power(y): found = True break if found: break if found: print("Yes") continue for p in primes_list: x = p * p if x > N: break y = N - x if y <= 0: continue if is_prime_power(y): found = True break if found: print("Yes") continue for p in primes_list: x = p if x > N: break y = N - x if y <= 0: continue if is_prime_power(y): found = True break if found: print("Yes") continue for q in primes_list: y = q x = N - y if x <= 0: continue if is_prime_power(x): found = True break if found: print("Yes") continue for a in range(1, 61): x = pow(2, a) if x > N: break y = N - x if y <= 0: continue if is_prime_power(y): found = True break if found: print("Yes") continue small_primes = [3,5,7,11,13,17,19,23,29,31,37] for p in small_primes: for a in range(1, 61): x = pow(p, a) if x > N: break y = N - x if y <= 0: continue if is_prime_power(y): found = True break if found: break if found: print("Yes") continue print("No") if __name__ == "__main__": solve()