筱瑪愛遊戲
題意:兩個人輪流從一個集合裏取一個數放到另外一個集合裏,如果使得這個集合存在一個子集異或和爲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");
}