結果
| 問題 |
No.2 素因数ゲーム
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-09-22 23:24:48 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 45 ms / 5,000 ms |
| コード長 | 1,706 bytes |
| コンパイル時間 | 144 ms |
| コンパイル使用メモリ | 82,160 KB |
| 実行使用メモリ | 60,928 KB |
| 最終ジャッジ日時 | 2024-06-26 23:53:37 |
| 合計ジャッジ時間 | 2,419 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 31 |
ソースコード
def mex(array):
i = 0
while i in array:
i += 1
return i
def solve(NN):
""" NN: kの最大値(大雑把に遷移可能回数の最大値) """
grundy = defaultdict(lambda: -1)
for k in range(NN+1):
for p in data_set(k):
grundy[p] = mex(list(grundy[q] for q in next_set(p)))
return grundy
def solve2(NN):
""" 一次元専用 """
grundy = [-1]*(NN+1)
for p in range(NN+1):
grundy[p] = mex(list(grundy[q] for q in next_set(p)))
return grundy
def zeros(grundy):
tmp = set()
for k in range(len(grundy)):
for p in data_set(k):
if not grundy[p]:
tmp.add(p)
return sorted(list(tmp))
def Sprague_Grundy(NN, array):
""" N 個の部分不偏ゲームを並行して行うような不偏ゲーム """
grundy = solve(NN)
tmp = 0
for p in array:
tmp ^= grundy[p]
return tmp
####( 問題毎に設定 )##################################################
def data_set(k):
""" 有限ゲームなので、何かの変数は単調減数となっている。これを k とする。"""
yield k
def next_set(p):
tmp = set()
for i in range(1, p+1):
if p-i>=0:
tmp.add(p-i)
return tmp
####################################################################
def prime_factors(n):
i = 2
while i * i <= n:
if n % i:
i += 1
else:
n //= i
yield i
if n > 1:
yield n
from collections import defaultdict
from collections import Counter
N = int(input())
d = Counter(prime_factors(N))
A = list(d.values())
print("Alice" if Sprague_Grundy(max(A),A)!=0 else "Bob")