1. 程式人生 > 其它 >CF768E Game of Stones 題解

CF768E Game of Stones 題解

有n堆石子,對於任意一堆,取的個數不能與之前任何一次取這堆取的個數相同.兩人輪流取,問先手是否必勝.

有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;
}

本文來自部落格園,作者:Kinuhata,轉載請註明原文連結:https://www.cnblogs.com/KinuhataSaiai/p/15550927.html