[文章目录]
Description
有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数。两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏。问先手是否必胜。1<=n<=1000 0<=ai<=10000
差分a数组,那么每次操作相当于把一个位置上的石子移到其下一个位置上。说是个经典模型:阶梯NIM。
偶数堆可以不理,因为你从2k->2k-1,我就可以从2k-1->2k-2。奇数堆的移动一定是移项偶数堆,使得石子变得没用,等价于拿走石子,变成关于奇数堆的NIM游戏模型。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,a[1100];
int main()
{
int T; scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",a+i);
for(int i=n;i;--i) a[i]-=a[i-1];
int tmp=0;
for(int i=n;i>0;i-=2) tmp^=a[i];
if(tmp) puts("TAK");
else puts("NIE");
}
return 0;
}