传送门biu~
阶梯Nim游戏大意:每个阶梯上有一堆石子,两个人在阶梯上玩推石子游戏。每人可以将某堆的任意多石子向左推一阶,所有的石子都推到阶梯下了即算成功。
如果只考虑对偶数堆的操作,如果对方将偶数堆的石子推向了奇数堆,那么我们就可以把这些石子再往左推推向更左边的偶数堆——这样一个回合,奇数堆中的状态并没有改变,玩家的顺序也并没有改变,但是偶数堆却慢慢地向阶梯下移。也就是说对偶数堆操作的情况我们不用考虑;只考虑对奇数堆操作,玩家将奇数堆中的石子推到偶数堆,可以看做是从奇数堆中取走了若干石子,即可以用SG函数来判断胜负。
而对于此题,保证“每堆石子个数都不少于前一堆的石子个数”,我们可以构建一个“反阶梯Nim游戏”,阶梯上每堆石子的数量是原题中两堆石子的数量差。原题中,取走一个堆中的石子,下一个堆中的石子数目与这个堆中的石子数目差一定会增大——也就是说在“反阶梯Nim游戏”中相当于把一个阶梯上的石子推向右边的下一个阶梯,运行原理与阶梯Nim游戏相同。注意奇偶堆的判断要从n开始。
#include<bits/stdc++.h>
using namespace std;
int a[10005];
int main(){
int T;
scanf("%d",&T);
while(T--){
int ans=0,n;
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
for(int i=n;i>1;i-=2) ans^=(a[i]-a[i-1]);
if(n&1) ans^=a[1];
printf(ans ? "TAK\n" : "NIE\n");
}
return 0;
}