結果
| 問題 |
No.7 プライムナンバーゲーム
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-11-20 11:44:23 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,024 ms / 5,000 ms |
| コード長 | 1,058 bytes |
| コンパイル時間 | 183 ms |
| コンパイル使用メモリ | 82,072 KB |
| 実行使用メモリ | 82,500 KB |
| 最終ジャッジ日時 | 2024-09-21 12:36:56 |
| 合計ジャッジ時間 | 8,208 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 17 |
ソースコード
import sys
sys.setrecursionlimit(10 ** 5)
import pypyjit
pypyjit.set_param('max_unroll_recursion=-1')
N = int(input())
# 素数表を作っておく
F = [True] * (N + 1)
F[0] = False
F[1] = False
for i in range(2, N + 1):
if not F[i]:
continue
for j in range(i ** 2, N + 1, i):
F[j] = False
facts = []
for i in range(N + 1):
if F[i]:
facts.append(i)
# N = 0,1にしてしまったら負け -> N = 0,1を受け取ったら勝ち
mem = [False] * (N + 1)
win = [False] * (N + 1)
for i in range(2):
mem[i] = True
win[i] = True
def f(x):
# print("x",x,"を受け取る")
if mem[x]:
# print(x,"は","勝ち" if win[x] else "負け")
return win[x]
# 負けの状態に遷移できるのであれば勝ち
res = False
for fact in facts:
if x - fact < 0:
break
res |= not f(x - fact)
mem[x] = True
win[x] = res
# print(x,"は","勝ち" if win[x] else "負け")
return res
if f(N):
print("Win")
else:
print("Lose")