結果
問題 |
No.458 異なる素数の和
|
ユーザー |
![]() |
提出日時 | 2025-04-15 22:43:45 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,269 bytes |
コンパイル時間 | 195 ms |
コンパイル使用メモリ | 82,032 KB |
実行使用メモリ | 59,684 KB |
最終ジャッジ日時 | 2025-04-15 22:44:58 |
合計ジャッジ時間 | 2,244 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 27 WA * 1 |
ソースコード
def main(): import sys N = int(sys.stdin.readline().strip()) if N < 2: print(-1) return # Sieve of Eratosthenes to generate primes up to N sieve_size = N is_prime = [True] * (sieve_size + 1) is_prime[0] = is_prime[1] = False for i in range(2, int(sieve_size**0.5) + 1): if is_prime[i]: for j in range(i*i, sieve_size+1, i): is_prime[j] = False primes = [i for i, prime in enumerate(is_prime) if prime] selected = [] sum_selected = 0 k = 0 # Greedily select primes for p in primes: if sum_selected + p > N: break selected.append(p) sum_selected += p k += 1 if sum_selected == N: print(k) return # Check if we can adjust by replacing one prime def check_possible(selected_primes, d): s = set(selected_primes) for p in selected_primes: candidate = p + d if candidate > sieve_size: # Need to check if candidate is prime, but sieve is up to N # So candidate might be beyond sieve, but in our problem, candidate can't exceed N + (some prime) # However, since d = N - sum_selected, and sum_selected is sum of primes up to selected[-1] # sum_selected + next_prime > N, so next_prime > d # So candidate = p + d < p + next_prime. But since p is in selected_primes, which are all <= selected[-1] # and next_prime is the next prime after selected[-1], candidate could be up to selected[-1] + d # However, d = N - sum_selected, and sum_selected + next_prime > N => next_prime > d # So candidate = p + d <= selected[-1] + d < selected[-1] + next_prime # But since selected[-1] < next_prime, candidate < next_prime + next_prime = 2*next_prime # But since next_prime could be larger than N, we can't check via sieve. So for this problem, since sieve is up to N, we can't check candidates beyond N. # However, in our problem, d = N - sum_selected, and sum_selected is sum of primes up to selected[-1] # sum_selected + next_prime > N => next_prime > d # candidate = p + d <= selected[-1] + d = selected[-1] + (N - sum_selected) # sum_selected = sum of selected_primes, which includes selected[-1] # So selected[-1] <= sum_selected # So candidate <= sum_selected + (N - sum_selected) = N # Therefore, sieve up to N is sufficient pass if candidate <= sieve_size and is_prime[candidate] and candidate not in s: return True return False d = N - sum_selected if check_possible(selected, d): print(k) return # Try reducing the number of primes selected while k > 0: # Remove the last prime last_p = selected.pop() sum_selected -= last_p k -= 1 d = N - sum_selected if d <= 0: continue if check_possible(selected, d): print(k) return print(-1) if __name__ == "__main__": main()