题意:n堆石子,两个人轮流拿,每次可以选择任意一堆取任意个(不能不拿)或者将一个堆分成3个小堆,问先手胜还是后手胜。
分析:打表找sg函数的规律,不会证明。。i=8*k+7时sg[i]=8*k+8,i=8*k+8时sg[i]=8*k+7其他情况sg[i]=i。
代码:
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<bitset>
#include<math.h>
#include<vector>
#include<string>
#include<stdio.h>
#include<cstring>
#include<iostream>
#include<algorithm>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
const int N=1010;
const int mod=100000000;
const int MOD1=1000000007;
const int MOD2=1000000009;
const double EPS=0.00000001;
typedef long long ll;
const ll MOD=1000000007;
const int INF=1000000010;
const ll MAX=1ll<<55;
const double pi=acos(-1.0);
typedef double db;
typedef unsigned long long ull;
int main()
{
int a,i,n,t,xo;
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
for (xo=0,i=1;i<=n;i++) {
scanf("%d", &a);
if (a%8==0) xo^=a-1;
else if (a%8==7) xo^=a+1;
else xo^=a;
}
if (xo) printf("First player wins.\n");
else printf("Second player wins.\n");
}
return 0;
}