結果
問題 |
No.458 異なる素数の和
|
ユーザー |
![]() |
提出日時 | 2025-04-15 22:37:35 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 62 ms / 2,000 ms |
コード長 | 2,194 bytes |
コンパイル時間 | 228 ms |
コンパイル使用メモリ | 81,772 KB |
実行使用メモリ | 73,788 KB |
最終ジャッジ日時 | 2025-04-15 22:38:23 |
合計ジャッジ時間 | 2,514 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 28 |
ソースコード
import bisect def sieve(n): if n < 2: return [] sieve = [True] * (n + 1) sieve[0] = sieve[1] = False for i in range(2, int(n**0.5) + 1): if sieve[i]: sieve[i*i : n+1 : i] = [False] * len(sieve[i*i : n+1 : i]) primes = [i for i, is_prime in enumerate(sieve) if is_prime] return primes def main(): N = int(input().strip()) primes = sieve(N) if not primes: print(-1) return if N == 2: print(1) return # Compute cumulative sums cumulative = [] s = 0 for p in primes: s += p cumulative.append(s) if s > N: break max_m = 0 for i in range(len(cumulative)): if cumulative[i] <= N: max_m = i + 1 # 1-based index else: break found = False for m in range(max_m, 0, -1): sum_m = cumulative[m-1] D = N - sum_m if D < 0: continue if D == 0: print(m) return initial_primes = primes[:m] available_primes = primes[m:] available_set = set(available_primes) available_sorted = available_primes # Check single replacement for p in initial_primes: q = p + D if q in available_set and q > p: print(m) return # Check pair replacement for i_p1 in range(m): p1 = initial_primes[i_p1] for i_p2 in range(i_p1 + 1, m): p2 = initial_primes[i_p2] required_sum = p1 + p2 + D max_q1 = required_sum - p2 - 1 if max_q1 < p1 + 1: continue left = bisect.bisect_right(available_sorted, p1) right = bisect.bisect_right(available_sorted, max_q1) for q1 in available_sorted[left:right]: q2 = required_sum - q1 if q2 in available_set and q2 > p2 and q2 != q1: print(m) return print(-1) if __name__ == "__main__": main()