链接:https://ac.nowcoder.com/acm/contest/946/E

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 524288K,其他语言1048576K

64bit IO Format: %lld

题目描述

筱玛是一个热爱游戏的好筱玛。最近,筱玛和马爷在玩这样一种游戏:

首先,桌面上一共有nn个数。

两个人轮流从桌面上取走一个数,并把这个数放入集合中。

如果在某次操作结束后,集合中存在一个异或和为00的​非空​子集,那么进行这次操作的人输。

如果全部取完,则最后操作的人赢。

筱玛和马爷都聪明绝顶,他们都会按照最优策略进行游戏。

马爷作为筱玛的爷爷,决定让筱玛选择先手还是后手。

筱玛为了稳操胜券,想提前知道对于当前的游戏,是先手必胜还是后手必胜。

筱玛想考考你,让你帮他解决这个问题。

输入描述:

输入共两行。

第一行一个整数nn,表示桌面上一共有n个数字。

第二行读入nn个数,表示桌面上每个数的数值。

输出描述:

输出"First"或"Second"(不包括引号)表示先手赢或后手赢。

示例1

输入

复制

3
1 2 3

输出

复制

Second

备注:

对于100%的数据,n≤105,数值大小≤261。

将数据范围缩小至线性基内的基数。然后判断基数的奇偶就可以了

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
const int N=1e5+10;
ll a[N],p[100];
int n;
int insert(ll x){

for(int j=62;j>=0;j--) {
if(!(x>>j&1)) continue;
if(!p[j]) { p[j]=x; return 1; }
x^=p[j];
}
return 0;
}

int main(){
cin>>n;
ll sum=0;
int num=0;
for(int i=1;i<=n;++i){
cin>>a[i];
if(insert(a[i])) num++;
}

if(num%2==1){
printf("First\n");
}
else printf("Second\n");
}