首页 > 技术文章 > Bzoj1115 石子游戏Kam

SilverNebula 2016-07-10 22:17 原文

这是道权限题,差评。

 

题目说明引自ZYF-ZYF

Description

有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数。两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏。问先手是否必胜。

Input

第一行u表示数据组数。对于每组数据,第一行N表示石子堆数,第二行N个数ai表示第i堆石子的个数(a1<=a2<=……<=an)。 1<=u<=10 1<=n<=1000 0<=ai<=10000

Output

u行,若先手必胜输出TAK,否则输出NIE。

Sample Input

 

2

2

2 2

3

1 2 4

 

Sample Output

 

NIE

TAK

 

从i处移走x个石子,可以看做从i处移x个到i+1处,而i+1处下次可以多移x个石子。

这样可以把问题转化成阶梯上的nim问题

 

天呐又是nim

 

 1 /*by SilverN*/
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 using namespace std;
 8 int s,n;
 9 int a[50000];
10 int main(){
11     int T;
12     scanf("%d",&T);
13     while(T--){
14         scanf("%d",&n);
15         int i;
16         for(i=1;i<=n;i++)scanf("%d",&a[i]);
17         a[n+1]=0;
18         s=0;
19         for(i=1;i<=n;i++)if(i&1)s^=a[i]-a[i+1];
20         if(s)printf("TAK\n");
21         else printf("NIE\n");
22     }
23     return 0;
24 }

 

推荐阅读