結果
| 問題 |
No.458 異なる素数の和
|
| ユーザー |
lam6er
|
| 提出日時 | 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()
lam6er