結果

問題 No.3120 Lower Nim
ユーザー tassei903
提出日時 2025-04-18 22:46:16
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 393 ms / 2,000 ms
コード長 3,140 bytes
コンパイル時間 629 ms
コンパイル使用メモリ 82,152 KB
実行使用メモリ 95,048 KB
平均クエリ数 2685.91
最終ジャッジ日時 2025-04-18 22:46:31
合計ジャッジ時間 12,344 ms
ジャッジサーバーID
(参考情報)
judge1 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 43
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys
input = lambda :sys.stdin.readline()[:-1]
ni = lambda :int(input())
na = lambda :list(map(int,input().split()))
yes = lambda :print("yes");Yes = lambda :print("Yes");YES = lambda : print("YES")
no = lambda :print("no");No = lambda :print("No");NO = lambda : print("NO")
#######################################################################
# from functools import lru_cache

# @lru_cache(maxsize=None)
# def naive2(n, a, k):
#     if a == (0, ) * n:
#         return 0
#     res = 1
#     for i in range(n):
#         for x in range(1, min(a[i], k) + 1):
#             res &= naive2(n, a[:i] + (a[i] - x, ) + a[i+1:], x)
#     return 1 ^ res

# def naive(n, a):
#     return naive2(n, a, 5)

# def solve(n, a, k):
#     s = 0
#     if k == 1:
#         for i in range(n):
#             s ^= (a[i]) % 2
#     elif k <= 2:
#         for i in range(n):
#             s ^= a[i] % 4
#     else:
#         for i in range(n):
#             s ^= a[i] % 8

#     return int(s != 0)

# for i in range(1, 10):
#     for j in range(1, 10):
#         if 0 == naive2(2, (i, j), 4):
#             print(i, j)

# # for i in range(1, 10):
# #     for j in range(i, 10):
# #         for k in range(j, 10):
# #             assert naive(3, (i, j, k)) == solve(3, (i, j, k))
# from random import randint
# for _ in range(1000000):
#     n = randint(1, 5)
#     k = 8
#     a = tuple([randint(1, 10) for i in range(n)])
#     r1 = solve(n, a, k)
#     r2 = naive2(n, a, k)
#     if r1 == 0 and r2 == 1:
#         print("!")
#         print(n, a)
#         print(r1, r2)
#         break
#     # if r1 != r2:
#     #     print("!", n, a)
#     #     break
DEBUG = 0
from random import sample, randint


def get():
    global k, s
    if DEBUG:
        for j in sample(range(n), n):
            if a[j]:
                i = j
                x = randint(1, min(k, a[j]))
                break
    else:                
        i, x = na()
        i -= 1
    s ^= a[i]
    a[i] -= x
    s ^= a[i]
    k = x
    z = (1 << (k.bit_length())) - 1
    if DEBUG:
        if a == [0] * n:
            ret = -1
            assert False
        else:
            ret = 0
    else:
        ret = ni()

    if ret == -1:
        exit()

    return i, x

def ans():
    global k, s
    i = -1
    assert s != 0
    for j in range(n):
        for y in range(1, min(k, a[j]) + 1):
            if (s ^ a[j] ^ (a[j] - y)) & ((1 << y.bit_length()) - 1) == 0:
                i = j
                x = y
                break
        if i != -1:
            break
    # print(s, a, i)
    if not DEBUG:
        print(i+1, x, flush=True)
    
    assert x <= k
    k = x
    z = (1 << (k.bit_length())) - 1
    s ^= a[i]
    a[i] -= x
    s ^= a[i]
    if DEBUG:
        if a == [0] * n:
            ret = 1
        else:
            ret = 0
    else:
        ret = ni()
    if ret == 1 or ret == -1:
        exit()

n = ni()
a = na()

s = 0
for i in range(n):
    s ^= a[i]

k = 10 ** 9
if s == 0:
    print("Second", flush=True)
    i, x = get()
    # print(a, k)
else:
    print("First", flush=True)

while True:
    ans()
    # print(a, k)
    get()
    # print(a, k)
0