[CF15C] Industrial Nim

[CF15C] Industrial Nim - 博弈

Description

若干个区,第 i 个区中有 mi 堆石子,第 j 堆石子有 xi+j-1 个。合起来玩 Nim,判断胜负。

Solution

很明显这只是一个求连续自然数异或和的问题

由于 (2n) xor (2n+1) = 1,显然这玩意一定会以某种规律循环
若干个区,第 i 个区中有 mi 堆石子,第 j 堆石子有 xi+j-1 个。合起来玩 Nim,判断胜负。

我们发现,当 i mod 4 = 0,1,2,3 时,1,2,3,...,i 的异或和为 i,1,i+1,0

#include <bits/stdc++.h>
using namespace std;

#define int long long

int f(int x)
{
    if (x % 4 == 0)
        return x;
    if (x % 4 == 1)
        return 1;
    if (x % 4 == 2)
        return x + 1;
    if (x % 4 == 3)
        return 0;
}

signed main()
{
    ios::sync_with_stdio(false);
    int n;
    cin >> n;
    int ans = 0;
    while (n--)
    {
        int x, m;
        cin >> x >> m;
        ans ^= f(x + m - 1) ^ f(x - 1);
    }
    cout << (ans ? "tolik" : "bolik");
}
原文地址:https://www.cnblogs.com/mollnn/p/14411981.html