結果
問題 |
No.458 異なる素数の和
|
ユーザー |
|
提出日時 | 2025-02-17 17:40:54 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
TLE
|
実行時間 | - |
コード長 | 944 bytes |
コンパイル時間 | 269 ms |
コンパイル使用メモリ | 12,160 KB |
実行使用メモリ | 117,796 KB |
最終ジャッジ日時 | 2025-02-17 17:40:59 |
合計ジャッジ時間 | 4,618 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | -- * 3 |
other | AC * 1 TLE * 1 -- * 26 |
ソースコード
N = int(input()) # エラトステネスの篩で素数リストを作成 is_prime = [1] * (N+1) is_prime[0] = is_prime[1] = 0 for i in range(2, N+1): if is_prime[i]: for j in range(i*2, N+1, i): is_prime[j] = 0 primes = [i for i in range(N+1) if is_prime[i]] C = len(primes) # メモ化再帰 dp = [[-1] * (N+1) for _ in range(C+1)] import sys sys.setrecursionlimit(10101010) def dfs(i, w): if w == 0: return 0 # wをちょうど作れるならカウント開始 if i == C or w < 0: return -1 # これ以上選択できない場合 if dp[i][w] != -1: return dp[i][w] res = dfs(i+1, w) # i番目の素数を使わない場合 use_prime = dfs(i+1, w - primes[i]) # i番目の素数を使う場合 if use_prime != -1: # w-primes[i] を作れる場合のみカウント res = max(res, use_prime + 1) dp[i][w] = res return res print(dfs(0, N))