結果

問題 No.2 素因数ゲーム
ユーザー None
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #

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