有n堆石子,对于任意一堆,取的个数不能与之前任何一次取这堆取的个数相同.两人轮流取,问先手是否必胜.
显然对于任意一堆石子,取的次数最多的方案是从1开始依次递增取(最后若有剩余就合并到最后一次取的中去),比这种方案取的次数少的方案显然都是成立的,由于我们只关心某堆石子到底取多少次,显然转化为NIM游戏(因为NIM游戏就是每堆石子存在取1-n次取完的方案,容易发现,这与本问题是一致的,因为石子在影响胜负这个问题上的本质是其取的次数方案而不是他它的个数,即由个数和取法共同决定的.)将所有次数异或起来即为结果.
解题关键在于认识到NIM游戏的本质.
#include <iostream>
#include <cstdio>
using namespace std;
int n, ans, temp, sum;
int main()
{
ios::sync_with_stdio(false);
cin >> n;
for (int i = 1; i <= n; i++)
{
temp = 0, sum = 0;
cin >> temp;
for (int i = 1;; i++)
{
sum += i;
if (sum == temp)
{
temp = i;
break;
}
if (sum > temp)
{
temp = i - 1;
break;
}
}
ans ^= temp;
}
if (ans)
cout << "NO" << endl;
else
cout << "YES" << endl;
}