結果
問題 |
No.458 異なる素数の和
|
ユーザー |
|
提出日時 | 2025-02-17 17:58:44 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
MLE
|
実行時間 | - |
コード長 | 1,207 bytes |
コンパイル時間 | 580 ms |
コンパイル使用メモリ | 12,032 KB |
実行使用メモリ | 527,120 KB |
最終ジャッジ日時 | 2025-02-17 17:58:48 |
合計ジャッジ時間 | 4,102 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | -- * 3 |
other | AC * 1 MLE * 1 -- * 26 |
ソースコード
def max_prime_partition(N): from functools import lru_cache # エラトステネスの篩で素数列挙 def sieve(limit): is_prime = [True] * (limit + 1) is_prime[0] = is_prime[1] = False primes = [] for i in range(2, limit + 1): if is_prime[i]: primes.append(i) for j in range(i * i, limit + 1, i): is_prime[j] = False return primes primes = sieve(N) P = len(primes) import sys sys.setrecursionlimit(10101010) # メモ化再帰 DFS (残りの値 `remain` を `i` 以降の素数で作る) @lru_cache(None) def dfs(remain, i): if remain == 0: return 0 # 何も足さないときのカウントは0 if remain < 0 or i >= P: return -float("inf") # 不可能な場合 # 使わない場合 res = dfs(remain, i + 1) # 使う場合(異なる素数のみ) if primes[i] <= remain: res = max(res, 1 + dfs(remain - primes[i], i + 1)) return res ans = dfs(N, 0) return ans if ans > 0 else -1 # テストケース N = int(input()) print(max_prime_partition(N))