zoukankan      html  css  js  c++  java
  • Industrial Nim

    http://codeforces.com/contest/15/problem/C

    题意:

    现有n个采石场,第i个采石场有mi堆石子

    各堆分别有xi,xi+1……,xi+m-1颗石子

    两名选手使用最优策略进行Nim游戏,双方轮流操作

    每次操作为从任意一堆石子取出任意数量的石子,不能操作者败

    现对于一初始局面,先手必胜输出“tolik”,否则输出“bolik”(不含引号)

    解法:

    显然核心算法仍然是Nim

    然后用脑子想想

    f(x)表示1-x的异或和怎么求就好了

    其实怎么求都可以,想清楚就好了

     1 #include <cstdio>
     2 #include <iostream>
     3 
     4 using namespace std;
     5 
     6 typedef long long ll;
     7 
     8 ll f(ll x) {
     9     ll res = 0, cnt;
    10     for(ll i = 1;i <= x;i <<= 1) {
    11         cnt = x / (i << 1) * i;
    12         if(x % (i << 1) >= i) cnt += x % (i << 1) - i + 1;
    13         if(cnt & 1) res |= i;
    14     }
    15     return res;
    16 }
    17 
    18 int main() {
    19     int t;
    20     ll m, x, ans = 0;
    21     cin >> t;
    22     while(t --) {
    23         cin >> x >> m;
    24         ans ^= f(m + x - 1) ^ f(x - 1);
    25     }
    26     puts(ans ? "tolik" : "bolik");
    27     return 0;
    28 } 
    View Code
  • 相关阅读:
    053(四十四)
    053(四十三)
    053(四十二)
    053(四十一)
    053(四十)
    053(三十九)
    053(三十八)
    053(三十七)
    053(三十六)
    【leetcode❤python】231. Power of Two
  • 原文地址:https://www.cnblogs.com/ytytzzz/p/6637668.html
Copyright © 2011-2022 走看看