結果
問題 |
No.3030 Kruskal-Katona
|
ユーザー |
![]() |
提出日時 | 2025-05-14 13:09:29 |
言語 | PyPy3 (7.3.15) |
結果 |
RE
|
実行時間 | - |
コード長 | 3,515 bytes |
コンパイル時間 | 270 ms |
コンパイル使用メモリ | 82,176 KB |
実行使用メモリ | 65,536 KB |
最終ジャッジ日時 | 2025-05-14 13:10:34 |
合計ジャッジ時間 | 3,461 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | RE * 3 |
other | RE * 27 |
ソースコード
import sys def power(base, exp, mod): """ Calculates (base^exp) % mod efficiently. Uses the built-in pow function which is highly optimized. """ return pow(base, exp, mod) def is_prime_miller_rabin(n): """ Checks if a number n is prime using the Miller-Rabin primality test. This implementation is deterministic for n < 2^64. """ # Handle base cases for small numbers if n < 2: return False if n == 2 or n == 3: return True # Handle even numbers greater than 2 if n % 2 == 0: return False # Write n - 1 as 2^s * d, where d is odd d = n - 1 s = 0 while d % 2 == 0: d //= 2 s += 1 # Bases proven to be sufficient for deterministic Miller-Rabin for n < 2^64 # Source: FIPS 186-4 Appendix F / Wikipedia / various number theory resources # A commonly cited set is [2, 325, 9375, 28178, 450775, 9780504, 1795265022] # Another valid set for n < 3,317,044,064,679,887,385,961,981 is # [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37] (covers 2^64) # Let's use the smaller proven set for efficiency. # The problem constraint is n < 2^63, so this set is sufficient. bases_to_test = [2, 325, 9375, 28178, 450775, 9780504, 1795265022] for a in bases_to_test: # If the base is >= n, we can skip it or take mod n. # Since n can be small (e.g., n=5), some bases might be larger. # However, the properties hold if we effectively test a % n. # Let's just skip if a >= n, as the test is defined for 1 < a < n-1. # More correctly, if n itself is one of the small bases, it should be prime. # The initial checks handle n=2, n=3. If n is a larger prime base, # the test should correctly identify it. if a >= n: continue # Test base must be < n # Calculate x = a^d mod n x = power(a, d, n) # If x is 1 or n-1, n might be prime (passes this test base) if x == 1 or x == n - 1: continue # Repeat squaring s-1 times (check a^(d*2^r) for r = 1 to s-1) # We already have a^d (r=0). composite = True for r in range(1, s): # Calculate x = x^2 mod n = (a^(d*2^(r-1)))^2 mod n = a^(d*2^r) mod n x = power(x, 2, n) # If x is 1, then we found a non-trivial square root of 1 # (because the previous value was not n-1), so n is composite. if x == 1: return False # If x is n-1, n might be prime. Stop squaring for this base 'a' # and proceed to the next base. if x == n - 1: composite = False break # If the loop finished without finding x == n-1, then 'a' is a witness # to the compositeness of n. if composite: return False # If n passed the test for all chosen bases, it is (deterministically) prime # for the tested range. return True def solve(): """ Reads input, performs primality tests, and prints output. """ n_queries = int(sys.stdin.readline()) results = [] for _ in range(n_queries): x = int(sys.stdin.readline()) is_p = is_prime_miller_rabin(x) # Append result string "x 0" or "x 1" results.append(f"{x} {1 if is_p else 0}") # Print all results at once, separated by newlines print("\n".join(results)) # Run the main solve function if __name__ == "__main__": solve()