http://acm.hdu.edu.cn/showproblem.php?pid=4388

Nim变形,对一个\(n\)个石子的堆,每次取\(k(0<k<n)\)个(注意不能全取光),同时要保证\(n\oplus k<n\),并添加一堆新的大小为\(n\oplus k\)的石子。

同时每个人在整个游戏中还有一次机会把添加的大小为\(n\oplus k\)的石子改为\(n\oplus (2k)\)个石子,同样是不能操作的输,两个人采取最优策略。

初步想法

一般性地,我们还是先不管\(n\oplus k\)变成\(n\oplus(2k)\)这个操作,先想清楚没有这种操作的情况

很自然地去手算几个小数据,以及往二进制的方向想(毕竟异或都出来了),\(n=1,2\)都直接不能操作,\(n=3=(11)_2\)的时候可以取一个\(k=1\)或者\(k=2\),接下来\(k=4=(100)_2\)又不能操作了…

仔细想想就会发现对于一个\(2^k=(\underbrace{100\dots00}_{k个0})_2\)不管怎么取一个比\(n\)小的\(k\),异或之后一定比\(n\)大,所以对于一堆的\(2^k\)就是一个不能操作的状态。同样如果是\((100\dots 010\dots 00)_2\)这样的东西,只要取一个\(k=(100\dots000\dots00),n\oplus k=(000\dots010\dots00)_2\)一定是满足条件的。

(也就是从\(n\)的1里面选一些1出来当\(k\),剩下\(n\oplus k\)一定是小于\(n\)的)

于是有了初步的想法,二进制表示下\(m\)个1的\(n\)至少可以按照这种拆法拆\(m-1\)次

进一步如果这么拆,当\(m\)是奇数时先手必败,否则必胜

进一步

不过仔细想想好像也不一定要那么拆,比如:

\[\begin{aligned}n=&(1101011)_2 \\k=&(0100100)_2\\n\oplus k=&(1001111)_2\end{aligned}
\]

5位→2位+5位,4次→1次+4次=5次,嗯?乍一看好像上面那样优雅的结论被破坏掉了…(当时推到这里差点放弃前面的思路…)冷静想一想,一次操作改变奇偶性…这不还是很河里嘛…(先手奇→留给后手偶)

而且虽然1的个数变多了,但是其实在两个人都采取最优策略的情况下具有必胜策略的那个人其实每次单独拿一个\(2^k\)出来就总是能把1的个数降下来…所以终究是能把游戏结束掉

证明一下?

似乎不管怎么拆,每次拆完都会改变奇偶性。怎么证呢…

  • 考虑某一位\(p\),如果\(n\)的这一位为1,\(p\)的为0,那么\(n\oplus k\)的结果是1
  • 类似地,列出四种情况,奇偶性一定不变

为什么呢…好像很显然…因为异或本来就是模二意义下的加法…奇偶性当然不变了…

证明了个寂寞

于是有结论:\(n\)中1的个数和\(k\)与\(n\oplus k\)中1的个数之和的奇偶性相同

好像快做完了

这么看来好像\(n\oplus k\to n\oplus (2k)\)就是纯粹拿来唬人的呀…毕竟奇偶性还是不变(因为\(k\)和\(2k\)中的1的个数是一样的,再套用上面的结论)

于是就愉快地做完了

根据初始状态算出来“能进行操作的次数”,判一下奇偶性

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
const int N=1e5+5;
int f[N];
inline int calc(int x)
{
if(f[x])return f[x];
int r=0;
while(x){if(x&1)r++;x>>=1;}
return f[x]=r;
}
int main()
{
int T;scanf("%d",&T);
rep(tc,1,T)
{
int n,r=0;
scanf("%d",&n);
rep(i,1,n)
{
int a;scanf("%d",&a);
r+=calc(a)-1;
}
printf("Case %d: ",tc);
if(r&1)printf("Yes\n");
else printf("No\n");
}
}

HDU4388-Stone Game II-Nim变形的更多相关文章

  1. [hdu4388]Stone Game II

    不管是否使用技能,发现操作前后所有堆二进制中1的个数之和不变.那么对于一个堆其实可以等价转换为一个k个石子的堆(k为该数二进制的个数),然后就是个nim游戏. 1 #include<bits/s ...

  2. HDU4388:Stone Game II(博弈+思维)

    Stone Game II Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  3. HDU 3094 树上删边 NIM变形

    基本的树上删边游戏 写过很多遍了 /** @Date : 2017-10-13 18:19:37 * @FileName: HDU 3094 树上删边 NIM变形.cpp * @Platform: W ...

  4. hdu 4388 Stone Game II sg函数 博弈

    Stone Game II comes. It needs two players to play this game. There are some piles of stones on the d ...

  5. hdu 4388 Stone Game II

    Stone Game II HDU - 4388 题目大意: 给出n堆物品,每堆物品都有若干件,现在A和B进行游戏,每人每轮操作一次,按照如下规则: 1. 任意选择一个堆,假设该堆有x个物品,从中选择 ...

  6. HDU 4388 Stone Game II {博弈||找规律}

    Stone Game II Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  7. Leetcode--Last Stone Weight II

    Last Stone Weight II 欢迎关注H寻梦人公众号 You are given an array of integers stones where stones[i] is the we ...

  8. ZOJ 3964 NIM变形

    LINK 题意:n堆石子,Alice 和 Bob 轮流取石子,谁不能再取或被对方取完为败.但是对于alice拥有限制:b=0此堆正常无限制:b=1此堆Alice只能取奇数个石子:b=2只能取偶数个石子 ...

  9. LeetCode 1049. Last Stone Weight II

    原题链接在这里:https://leetcode.com/problems/last-stone-weight-ii/ 题目: We have a collection of rocks, each ...

  10. LeetCode 1140. Stone Game II

    原题链接在这里:https://leetcode.com/problems/stone-game-ii/ 题目: Alex and Lee continue their games with pile ...

随机推荐

  1. ABBYY FineReader 14新增了什么

    FineReader 是一款一体化的 OCR 和PDF编辑转换器,随着版本的更新,功能的增加,FineReader 14的推出继续为用户在处理文档时提高业务生产力,该版本包含若干新特性和功能增强,包括 ...

  2. 通过RayFire为图形添加二次破碎效果

    在完成3D建模之后,RayFire能帮助用户制作多种类型的破碎效果,如均匀碎片.放射状碎片.木碎等效果.另外,用户还可以利用RayFire的碎片选取功能,为图形进行二次破碎,以达到增加局部碎片的效果. ...

  3. 回收站都找不到的文件,EasyRecovery帮你找

    "有人相爱,有人看海,有人深夜两点还在找文件."没错,有人正是不才本人. 细数下来,这已经是本人第五六七八次丢文件了,每次丢的原因很奇怪:删错了.保存完找不到了.或者没有原因就那样 ...

  4. 如何使用OCR编辑器检查和识别文本

    ABBYY FineReader 15(Windows系统)中的OCR编辑器能帮助用户对扫描仪或者数码相机获取的图像文件进行自动文本识别,OCR区域绘制等,使这些图像文件能进一步转换为可编辑的格式.其 ...

  5. selenium+python自动化元素定位

    最近学习自动化测试,终于初步学习完成,需要进行博客日志总结,加深巩固自己的知识. 元素的八种定位方式 1.id 以百度为例子 我们在python输入的元素定位语法:bs.find_element_by ...

  6. P3287 [SCOI2014]方伯伯的玉米田

    首先可以证明,一定存在一种最优解,每次选择的区间结尾都是 \(n\).因为如果某一个区间结尾不是 \(n\),将其替换成 \(n\) 仍然保持单调不下降.接着都按这个策略拔高玉米. 令 \(f_{i, ...

  7. 【模板】【P3605】【USACO17JAN】Promotion Counting 晋升者计数——动态开点和线段树合并(树状数组/主席树)

    (题面来自Luogu) 题目描述 奶牛们又一次试图创建一家创业公司,还是没有从过去的经验中吸取教训--牛是可怕的管理者! 为了方便,把奶牛从 1⋯N(1≤N≤100,000) 编号,把公司组织成一棵树 ...

  8. 【AcWing 113】【交互】特殊排序——二分

    (题面来自AcWing) 有N个元素,编号1.2..N,每一对元素之间的大小关系是确定的,关系不具有传递性. 也就是说,元素的大小关系是N个点与N*(N-1)/2条有向边构成的任意有向图. 然而,这是 ...

  9. Java集合【7】--List接口超级详细解析

    目录 1.List接口的特性 2.List接口的源码解析 3.相关子类介绍 3.1 ArrayList 3.1.1 成员变量 3.1.2 构造方法 3.1.3 常用增删改查方法 添加元素 查询元素 更 ...

  10. AgileConfig-轻量级配置中心 1.1.0 发布,支持应用间配置继承

    AgileConfig轻量级配置中心自第一个版本发布不知不觉已经半年了.在并未进行什么推广的情况下收到了250个star,对我有很大的鼓舞,并且也有不少同学试用,并且给出了宝贵的意见,非常感谢他们.其 ...