Loading

P3480 [POI2009]KAM-Pebbles 题解

题目链接

首先,这道题看上去就是个博弈论,很显然的 \(Nim\) 游戏。

因为每一个的取法都和它的上一位有关。
有一种非常显然的转换方式 :我们把这若干堆石子从前向后做一个差分
我们记 \(a_i-a_{i-1}=b_i\)
题目转化成:

对于若干堆石子,第 \(i\) 堆石子的个数是 \(b_i\) ,问先手是否必胜?

好像有点问题:
因为所有的石子都是动态变化的。
很显然当一个石子堆变化时,它和它后面一个石子堆的差分结果一定会变化。
所以最传统的 \(Nim\) 游戏显然是不可行的。

考虑阶梯 \(Nim\) 游戏。
我们可以把每一个差分的结果都映射到一个阶梯上。
很容易发现:我们对于每一堆石子的任意一个操作都可以通过在阶梯上移动实现。
(本人较懒,图片就咕咕咕了)

当我们发现所有的石子都移到最上层的台阶时。
可以看出所有的差都变成了 \(0\) ,也就是说所有的都一样。
显然此时会分出胜负。

Code

#include <bits/stdc++.h>

const int N = 100005;

int T, n, a[N];

signed main(void) {
  std::ios::sync_with_stdio(false);
  std::cin.tie(0); std::cout.tie(0);
  std::cin >> T;
  for (int test = 1; test <= T; test ++) {
    std::cin >> n;
    int ans = 0;
    for (int i = 1; i <= n; i++) {
      std::cin >> a[i];
      int num = a[i] - a[i - 1];
      if ((n - i) % 2 == 0) ans ^= num; 
    }
    if (ans == 0)
      std::cout << "NIE" << std::endl;
    else
      std::cout << "TAK" << std::endl;
  }
}
posted @ 2022-04-26 10:17  Aonynation  阅读(33)  评论(0编辑  收藏  举报