题目描述
筱玛是一个热爱游戏的好筱玛。最近,筱玛和马爷在玩这样一种游戏:
首先,桌面上一共有
nn个数。
两个人轮流从桌面上取走一个数,并把这个数放入集合中。
如果在某次操作结束后,集合中存在一个异或和为
00的非空子集,那么进行这次操作的人输。
如果全部取完,则最后操作的人赢。
筱玛和马爷都聪明绝顶,他们都会按照最优策略进行游戏。
马爷作为筱玛的爷爷,决定让筱玛选择先手还是后手。
筱玛为了稳操胜券,想提前知道对于当前的游戏,是先手必胜还是后手必胜。
筱玛想考考你,让你帮他解决这个问题。
输入描述:
输入共两行。
第一行一个整数
nn,表示桌面上一共有n个数字。
第二行读入nn个数,表示桌面上每个数的数值。
输出描述:
输出"First"或"Second"(不包括引号)表示先手赢或后手赢。
输入
3 1 2 3
输出
Second
备注:
对于100%的数据,n\le10^5n≤105,数值大小\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; }