题目
https://vjudge.net/problem/HDU-5795#author=SCU2018
题意
给你n堆石子,两种操作
1 选择一堆 取任意个
2 选择一堆 分成三堆
不能操作的人为输
思路
如果没有第二种操作,就是NIM博弈,每堆石子的sg = 石子个数
现在sg[i] = mex(1,2,,,i-1,i-2^1^1,i-3^1^2,,,,)
打表发现 sg[8*k+7] = 8*k+8 sg[8*k] = 8*k-1 (sg[0]=0) 其他sg值不变
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
int sg[1100];
int vis[100];
void ok()
{
sg[0] =0 ;
for(int i = 1;i <= 50;i++)
{
memset(vis,0,sizeof(vis));
for(int j = 1;j <= i;j++)
{
vis[sg[j]] = 1;
}
if(i > 3)
{
for(int j = 1;j <= i-2;j++)
{
for(int k = 1;k <= i-j-1;k++)
{
vis[sg[i-j-k]^sg[j]^sg[k]] = 1;
}
}
}
for(int j = 0;j <= 100;j++)
{
if(vis[j] == 0)
{
sg[i] = j;
cout<<i<<" "<<j<<endl;
break;
}
}
}
}
int main()
{
ios::sync_with_stdio(0);
int T;
cin>>T;
while(T--)
{
int ans = 0;
int n;
cin>>n;
for(int i =1;i<=n;i++)
{
int x;
cin>>x;
if(x == 0) ans ^= x;
else if(x%8==0) ans ^= (x-1);
else if(x%8 == 7) ans ^= (x+1);
else ans ^= x;
}
if(ans) cout<<"First player wins."<<endl;
else cout<<"Second player wins."<<endl;
}
return 0;
}