結果
| 問題 |
No.3112 Decrement or Mod Game
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-04-19 00:54:52 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 2,366 bytes |
| コンパイル時間 | 409 ms |
| コンパイル使用メモリ | 12,032 KB |
| 実行使用メモリ | 11,264 KB |
| 最終ジャッジ日時 | 2025-04-19 00:54:57 |
| 合計ジャッジ時間 | 5,099 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | RE * 3 |
| other | RE * 65 |
ソースコード
#!/usr/bin/env python3
import sys
sys.setrecursionlimit(10**7)
def exact_dp_winner(A, B):
# dp[a][b] = True if the position (a,b) with Alice to move is winning for Alice
dp = [[False]*(B+1) for _ in range(A+1)]
# Base cases:
# If Alice already has 0, she can't move and thus loses (dp[0][b]=False).
# If Bob has 0 (i.e. b=0) and it's Alice's turn, then Alice wins immediately (dp[a][0]=True for a>0).
for a in range(1, A+1):
dp[a][0] = True
# dp[0][*] already False by initialization
for a in range(1, A+1):
for b in range(1, B+1):
win = False
# 1) subtract 1
if a-1 == 0:
win = True
elif not dp[a-1][b]:
win = True
# 2) divide by b, if possible
if not win and b <= a:
a2 = a // b
if a2 == 0:
win = True
elif not dp[a2][b]:
win = True
dp[a][b] = win
return dp[A][B]
def greedy_winner(A, B):
a, b = A, B
alice_turn = True
while True:
if alice_turn:
# Alice's move on 'a'
# how much does each option reduce?
sub = a - 1
if b > 1 and b <= a:
div = a // b
else:
div = a # treat dividing by 1 or invalid as no reduction
# pick the one that yields the smaller new a
if div < sub:
a = div
else:
a = sub
if a == 0:
return True
else:
# Bob's move on 'b'
sub = b - 1
if a > 1 and a <= b:
div = b // a
else:
div = b
if div < sub:
b = div
else:
b = sub
if b == 0:
return False
alice_turn = not alice_turn
def main():
A = int(sys.stdin.readline())
B = int(sys.stdin.readline())
# If both are small enough, do exact DP in O(A*B)
if A <= 2000 and B <= 2000:
alice_wins = exact_dp_winner(A, B)
else:
# otherwise, fall back to a fast greedy simulation (O(log max) steps)
alice_wins = greedy_winner(A, B)
print("Alice" if alice_wins else "Bob")
if __name__ == "__main__":
main()