题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5795
题意:一个n堆的取石子游戏,每次可以取一堆中的任意个,或者将当前堆分为三个非空堆。求先手/后手必胜。
思路:打表sg函数找规律。
#include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> using namespace std; #define N 1000100; #define LL long long int sg[200],vis[200]; /*void st() { int i,j,k; sg[0]=0; for(i=1;i<100;i++) { memset(vis,0,sizeof(vis)); for(j=0;j<i;j++) vis[sg[i-j]]=1; if(i>=3) { for(j=1;j<i-2;j++) for(k=1;k<i-2;k++) if(j+k<i) vis[sg[j]^sg[k]^sg[i-k-j]]=1; } j=0; while(vis[j]) j++; sg[i]=j; printf("%d ",sg[i]); } }*/ int main() { int t,n,a; //st(); cin>>t; while(t--) { int ans=0; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&a); if(a%8==0) a-=1; else if (a%8==7) a+=1; ans^=a; } printf("%s ",( ans ? "First player wins." : "Second player wins.")); } return 0; }