結果

問題 No.3666 League of Jigsaw
コンテスト
ユーザー tyawanmusi
提出日時 2026-08-22 16:48:28
言語 Python3
(3.14.7 + numpy 2.5.2 + scipy 1.18.0)
コンパイル:
python3 -mpy_compile _filename_
実行:
python3 _filename_
結果
AC  
実行時間 899 ms / 2,000 ms
+ 554µs
コード長 2,799 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 293 ms
コンパイル使用メモリ 21,412 KB
実行使用メモリ 15,868 KB
最終ジャッジ日時 2026-08-30 13:03:11
合計ジャッジ時間 6,299 ms
ジャッジサーバーID
(参考情報)
judge2_0 / judge3_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 6
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

# 状態 0
# ...
# ...
# ...

# u1
# o..
# ...
# ...

# d1
# ...
# ...
# o..

# u2
# o..
# o..
# ...

# d2
# ...
# o..
# o..

# uu
# oo.
# ...
# ...

# dd
# ...
# ...
# oo.

# 状態 -> 状態の必要コスト (l, j, o)

# 0 ->
# u1 (0,1,0)
# d1 (1,0,0)
# u2 (0,1,1)
# d2 (1,0,1)

# u1 ->
# dd (0,1,0)
# d2 (0,0,1)

# d1 ->
# uu (1,0,0)
# u2 (0,0,1)

# u2 ->
# 0 (0,1,0)
# u1 (2,0,0)

# d2 ->
# 0 (1,0,0)
# d1 (0,2,0)

# uu ->
# 0 (0,0,1)
# u2 (2,1,0),(0,3,0)

# dd ->
# 0 (0,0,1)
# d2 (3,0,0),(1,2,0)

# u2, d2, uu, dd については簡単に縮約ができ、以下のようなコストになる

# 0 ->
# u1 (0,1,0),(2,1,1)
# d1 (1,0,0),(1,2,1)
# 0 (0,2,1),(2,0,1)

# u1 ->
# 0 (0,1,1),(1,0,1),(4,1,0),(2,3,0)
# d1 (0,2,1),(3,3,0),(1,5,0)

# d1 ->
# 0 (1,0,1),(0,1,1),(3,2,0),(1,4,0)
# u1 (2,0,1),(5,1,0),(3,3,0)

# 改めてパスを列挙
# ここら辺まで来たらコード書いて、他のコストの和で表せるものは省略するのが良い

# 0 -> 0
# (0,2,1),(2,0,1)

# 0 -> u1 -> 0
# (1,1,1),(4,2,0),(2,4,0)

# 0 -> d1 -> 0
# 他のコストの和で全て表せる

# 0 -> u1 -> d1 -> 0
# (1,7,1),(2,10,0)

# 0 -> d1 -> u1 -> 0
# (7,1,1),(10,2,0)

# u1 -> d1 -> u1
# 他のコストの和で全て表せる

# よって、以下のコストの組み合わせで (l, j, o) を表せるか、という問題に帰着
# A: (4,2,0), (2,4,0)
# B: (0,2,1), (2,0,1), (1,1,1)
# C: (7,1,1), (1,7,1)
# D: (10,2,0), (2,10,0)
# 不変量として (l+j-2o)//6 = k とする。 k, o を消費して作れる l, j の範囲を考える(対称性から l だけ考える)
# A: k = 1, o = 0, l += [2, 4]
# B: k = 0, o = 1, l += [0, 1, 2] 
# C: k = 1, o = 1, l += [1, 7]
# D: k = 2, o = 0, l += [2, 10]
# l の最大値を考えると、k, o を消費して作れる l の最大値は 5k + 2o であることがわかる( o >= 1 )
# l の最小値を考えると、k, o を消費して作れる l の最小値は k であることがわかる( o >= 1 )
# k, o が同じである全ての (l,j) を作れるのか?
# (l_max, j_min) から (-1, +1) ずつずらすことができればよい
# グループA,Dを使うことで l を 2 ずつ減らすことができる
# o >= 1 のとき:
# 必ずグループB,Cを使っているため、 l を 1 ずつ減らすことができる
# o = 0 のとき:
# l, j の偶奇を変更できない

for _ in range(int(input())):
    l, j, o = map(int, input().split())
    if (l + j - 2 * o) % 6 != 0:
        print("No")
        continue
    k = (l + j - 2 * o) // 6
    if k < 0:
        print("No")
        continue
    if k <= l <= 5 * k + 2 * o and k <= j <= 5 * k + 2 * o:
        if o == 0:
            if l % 2 + j % 2 != 0:
                print("No")
                continue
        print("Yes")
    else:
        print("No")
0