筱玛爱游戏
题意:两个人轮流从一个集合里取一个数放到另外一个集合里,如果使得这个集合存在一个子集异或和为0则?。问最后是先手赢还是后手。
思路:子集异或和不为0这不是跟线性基的性质很像吗,那么我们把原数组构造一个线性基,判断能插入到线性基里的个数,如果数量为奇数那么是先手赢,否则后手赢。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[70];
int insert(ll x){
for(int i=61;i>=0;i--){
if(x&(1ll<<i)){
if(!a[i]){
a[i]=x;
return 1;
}
x^=a[i];
}
}
return 0;
}
int main(){
int n;
ll x;
scanf("%d",&n);
int ans=0;
for(int i=0;i<n;i++){
scanf("%lld",&x);
ans^=insert(x);
}
if(ans)
puts("First");
else puts("Second");
}