結果

問題 No.458 異なる素数の和
ユーザー atommy-euph
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #

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))
0