結果

問題 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
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 40 ms
52,352 KB
testcase_01 AC 735 ms
77,952 KB
testcase_02 AC 698 ms
77,928 KB
testcase_03 AC 720 ms
77,852 KB
testcase_04 AC 738 ms
78,080 KB
testcase_05 AC 719 ms
77,652 KB
testcase_06 AC 744 ms
77,952 KB
testcase_07 AC 739 ms
77,604 KB
testcase_08 AC 730 ms
77,968 KB
testcase_09 AC 741 ms
77,868 KB
testcase_10 AC 716 ms
77,952 KB
testcase_11 AC 737 ms
77,824 KB
testcase_12 AC 729 ms
77,960 KB
testcase_13 AC 733 ms
78,144 KB
testcase_14 AC 709 ms
77,852 KB
testcase_15 AC 724 ms
77,884 KB
testcase_16 AC 727 ms
78,212 KB
testcase_17 AC 709 ms
77,720 KB
testcase_18 AC 747 ms
78,336 KB
testcase_19 AC 734 ms
78,208 KB
testcase_20 AC 723 ms
77,788 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

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