結果
| 問題 |
No.2814 Block Game
|
| コンテスト | |
| ユーザー |
とりゐ
|
| 提出日時 | 2024-07-19 23:27:46 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 747 ms / 2,000 ms |
| コード長 | 1,678 bytes |
| コンパイル時間 | 331 ms |
| コンパイル使用メモリ | 82,204 KB |
| 実行使用メモリ | 78,336 KB |
| 最終ジャッジ日時 | 2024-07-19 23:28:05 |
| 合計ジャッジ時間 | 17,603 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 20 |
ソースコード
memo={}
def naive(n,c0,c1,d0,d1,f):
if n==0:
return f==0
if (c0,c1,d0,d1,f) in memo:
return memo[(c0,c1,d0,d1,f)]
mex=set()
if c0>0 and d0>0:
mex.add(naive(n-1,c0-1,c1,d0-1,d1,f^1))
if c1>0 and d0>0:
mex.add(naive(n-1,c0,c1-1,d0-1,d1,f^1))
if c0>0 and d1>0:
mex.add(naive(n-1,c0-1,c1,d0,d1-1,f^1))
if c1>0 and d1>0:
mex.add(naive(n-1,c0,c1-1,d0,d1-1,f))
g=0
while g in mex:
g+=1
memo[(c0,c1,d0,d1,f)]=g
return g
def check(n,c0,c1,d0,d1,f):
if min(c0,c1,d0,d1)==0:
if c0==0:
sm=d1%2
elif c1==0:
sm=0
elif d0==0:
sm=c1%2
else:
sm=0
return (sm&1)==f
if n%2==1:
return True
if min(c0,c1,d0,d1)==1:
return True
return False
if 0:
for n in range(1,9):
for c0 in range(n+1):
for d0 in range(n+1):
for f in range(2):
c1=n-c0
d1=n-d0
#print((n,c0,c1,d0,d1,f),naive(n,c0,c1,d0,d1,f))
# if naive(n,c0,c1,d0,d1,f)==0:
# if min(c0,c1,d0,d1)>=1:
# print("lose",n,(c0,c1,d0,d1,f))
# elif min(c0,c1,d0,d1)>=1:
# print("win",n,(c0,c1,d0,d1,f))
ans1=(naive(n,c0,c1,d0,d1,f)>=1)
ans2=check(n,c0,c1,d0,d1,f)
if ans1!=ans2:
print(n,(c0,c1,d0,d1,f),ans1,ans2)
def binom(n,r):
return int((n&r)==r)
def count(n):
c=0
for i in range(60):
if (n>>i)&1:
c+=1
return 1<<c
def solve(n,s):
f=int(s!="Even")
c1=count(n-1)
c0=n-c1
d0=n//2
d1=n-d0
if check(n,c0,c1,d0,d1,f):
print("Alice")
else:
print("Bob")
for _ in range(int(input())):
n,s=input().split()
solve(int(n),s)
とりゐ