HDU4388-Stone Game II-Nim变形
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\)是奇数时先手必败,否则必胜
进一步
不过仔细想想好像也不一定要那么拆,比如:
\]
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变形的更多相关文章
- [hdu4388]Stone Game II
不管是否使用技能,发现操作前后所有堆二进制中1的个数之和不变.那么对于一个堆其实可以等价转换为一个k个石子的堆(k为该数二进制的个数),然后就是个nim游戏. 1 #include<bits/s ...
- HDU4388:Stone Game II(博弈+思维)
Stone Game II Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- HDU 3094 树上删边 NIM变形
基本的树上删边游戏 写过很多遍了 /** @Date : 2017-10-13 18:19:37 * @FileName: HDU 3094 树上删边 NIM变形.cpp * @Platform: W ...
- 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 ...
- hdu 4388 Stone Game II
Stone Game II HDU - 4388 题目大意: 给出n堆物品,每堆物品都有若干件,现在A和B进行游戏,每人每轮操作一次,按照如下规则: 1. 任意选择一个堆,假设该堆有x个物品,从中选择 ...
- HDU 4388 Stone Game II {博弈||找规律}
Stone Game II Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- Leetcode--Last Stone Weight II
Last Stone Weight II 欢迎关注H寻梦人公众号 You are given an array of integers stones where stones[i] is the we ...
- ZOJ 3964 NIM变形
LINK 题意:n堆石子,Alice 和 Bob 轮流取石子,谁不能再取或被对方取完为败.但是对于alice拥有限制:b=0此堆正常无限制:b=1此堆Alice只能取奇数个石子:b=2只能取偶数个石子 ...
- LeetCode 1049. Last Stone Weight II
原题链接在这里:https://leetcode.com/problems/last-stone-weight-ii/ 题目: We have a collection of rocks, each ...
- LeetCode 1140. Stone Game II
原题链接在这里:https://leetcode.com/problems/stone-game-ii/ 题目: Alex and Lee continue their games with pile ...
随机推荐
- java开发两年,连Spring的依赖注入的方式都搞不清楚,你工作可能有点悬!
Spring依赖注入 常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的 ...
- DNS系列—dig命令的使用
目录 如何安装dig dig常见用法 dig的基本语法 简单dig查询域名 指定DNS服务器查询 反查IP对应域名 如何安装dig dig是bind下面常见的工具,在linux系统上经常回用的一个dn ...
- 基于gin的golang web开发:docker
Golang天生适合运行在docker容器中,这得益于:Golang的静态编译,当在编译的时候关闭cgo的时候,可以完全不依赖系统环境. 一些基础 测试容器时我们经常需要进入容器查看运行情况,以下命令 ...
- Mac 上超好用的代码对比工具 beyond compare,对比json差异
导读 昨天下午,公司业务跑不通,然后开发组长让架构师联系我,给我发一个json和部署到dev上的微服务url,让我去测试下,将发来的json放到json.cn上愣是解析不出来,我就用之前的json请求 ...
- transient关键字的作用以及几个疑问的解决
目录 1.从Serilizable说到transient 2.序列化属性对象的类需要实现Serilizable接口? 3.不想被序列化的字段怎么办? 4.ArrayList里面的elementData ...
- 盘点腾讯Linux、 C++后台开发面试题,做好充足准备,不怕被Pass
一.C/C++ const 多态 什么类不能被继承 二.网络 网络的字节序 网络知识 TCP三次握手 各种细节 timewait状态 TCP与UDP的区别 概念 适用范围 TCP四次挥 ...
- 企业安全03Django GIS SQL注入漏洞CVE-2020-9402
Django GIS SQL注入漏洞CVE-2020-9402 一.漏洞描述 Django是Django基金会的一套基于Python语言的开源Web应用框架.该框架包括面向对象的映射器.视图系统.模板 ...
- 测试Hessian反序反序列化 客户端少字段和多字段时能否成功
import java.io.*; import com.caucho.hessian.io.HessianInput; import com.caucho.hessian.io.HessianOut ...
- High-Resolution Image Inpainting using Multi-Scale Neural Patch Synthesis
论文来源:CVPR 2017 摘要 之前方法的缺点:之前的方法是基于语义和上下文信息的,在填充较大holes的表现得很好,能够捕获更高级的图像特征,但是由于内存限制和难以训练网络的因素,只能处理分辨率 ...
- SpringBoot打包成Docker镜像
1. 本文环境 Maven:3.6.3(Maven配置参考) SpringBoot version:2.3.4.RELEASE Docker version: 19.03.11(Docker搭建参考) ...