Description
n堆取石子游戏,每次可以取一堆中的任意个,或者将当前堆分为三个非空堆,问先手必胜还是后手必胜
Input
第一行一整数T表示用例组数,每组用例首先输入石子堆数n,之后n个整数表示n堆石子的石子数量ai(1<=T<=100,1<=n<=10^6,1<=ai<=10^9)
Output
对于每组用例,若先手必胜则输出First player wins.,否则输出Second player wins.
Sample Input
2
2
4 4
3
1 2 4
Sample Output
Second player wins.
First player wins.
Solution
打表求sg值找规律,发现sg[0]=0,当x%8=0时sg[x]=x-1 ,当x%8=7时sg[x]=x+1,其他的都是sg[x]=x
Code
#include<cstdio>
#include<iostream>
using namespace std;
int T,n,x,ans;
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
ans=0;
while(n--)
{
scanf("%d",&x);
if(x%8==0)x--;
else if(x%8==7)x++;
ans^=x;
}
if(n==1||ans)printf("First player wins.\n");
else printf("Second player wins.\n");
}
return 0;
}