筱玛爱游戏

题目描述 

筱玛是一个热爱游戏的好筱玛。最近,筱玛和马爷在玩这样一种游戏:
首先,桌面上一共有 nn个数。
两个人轮流从桌面上取走一个数,并把这个数放入集合中。
如果在某次操作结束后,集合中存在一个异或和为 00的非空子集,那么进行这次操作的人输。
如果全部取完,则最后操作的人赢。
筱玛和马爷都聪明绝顶,他们都会按照最优策略进行游戏。
马爷作为筱玛的爷爷,决定让筱玛选择先手还是后手。
筱玛为了稳操胜券,想提前知道对于当前的游戏,是先手必胜还是后手必胜。
筱玛想考考你,让你帮他解决这个问题。

输入描述:

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

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

输出描述:

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

输入

3
1 2 3

输出

Second

备注:

对于100%的数据,n\le10^5n105,数值大小\le2^{61}261。
//利用线性基的性质完成求解
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 64;
typedef long long LL;
const int MAXM = 1e5 + 7;
LL a[MAXM];
LL num[MAXN];
int insert(LL x) {
    for (int i = 63; i >= 0; i--) {
        if ((x >> i) & 1) {
            if (!num[i]) {
                num[i] = x;
                return 1;
            }
            x ^= num[i];
        }
    }
    return 0;
}
int main() {
    int n, ans = 0;
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i];
    for (int i = 1; i <= n; i++) {
        ans += insert(a[i]);
    }
    if (ans & 1) cout << "First" << endl;
    else cout << "Second" << endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/HighLights/p/13364327.html