题目链接:https://cn.vjudge.net/contest/269933#problem/H

具体思路:首先,这是一个公平的比赛,并且是两个人参与,两个人都足够聪明,并且可以通过有限步结束比赛,所以可以通过sg函数解决,注意这个题的不同,假设当前的某一堆堆数是5,如果分成每堆为2,他的子状态是2 2 1,和之前做过的子状态不同,之前做的题拿掉的就相当于扔掉了,而这个题并没有。

 #include<iostream>
#include<string>
#include<iomanip>
#include<stack>
#include<queue>
#include<map>
#include<vector>
#include<cmath>
#include<stdio.h>
#include<cstring>
using namespace std;
# define ll long long
# define maxn +
# define inf 0x3f3f3f3f
int ans[maxn];
int vis[maxn];
int main()
{
ans[]=;
for(int i=; i<=; i++)
{
memset(vis,,sizeof(vis));
for(int j=; j<i; j++)
{
int temp=i/j;
if(temp%==)vis[ans[i%j]]=;//如果按照每一堆j个,如果有2堆,那么他们的异或是0,如果有一堆,他们的异或就是本身,所以这个地方可以化简一下,直接判断奇数还是偶数就可以了。
else vis[ans[i%j]^ans[j]]=;
}
for(int j=; j<=; j++)
{
if(vis[j]==)
{
ans[i]=j;
break;
}
}
}
int n;
int temp;
int t=;
scanf("%d",&n);
for(int i=; i<=n; i++)
{
scanf("%d",&temp);
t^=ans[temp];
}
if(t)printf("First\n");
else printf("Second\n");
return ;
}
05-02 22:58