题意:每次可以翻动一个、二个或三个硬币。(Mock Turtles游戏)

初始编号从0开始。

当N==1时,硬币为:正,先手必胜,所以sg[0]=1.

当N==2时,硬币为:反正,先手必赢,先手操作后可能为:反反或正反,方案数为2,所以sg[1]=2。

当N==3时,硬币为:反反正,先手必赢,先手操作后可能为:反反反、反正反、正反正、正正反,方案数为4,所以sg[2]=4。

位置x:0  1  2  3  4   5    6   7    8     9  10  11  12  13  14...

sg[x]:  1  2  4  7  8  11
13 14  16  19  21  22  25  26  28…

看上去sg值为2x或者2x+1。我们称一个非负整数为odious,当且仅当该数的二进制形式的1出现的次数是奇数,否则称作evil。所以1,2,4,7是odious因为它们的二进制形式是1,10,100,111.而0,3,5,6是evil,因为它们的二进制形式是0,11,101,110。而上面那个表中,貌似sg值都是odious数。所以当x为odious时,sg值是2x,当x是evil时,sg值是2x+1.

这样怎么证明呢?我们会发现,

evil^evil=odious^odious=evil

                                                      evil^odious=odious^evil=odious

假设刚才的假说是成立的,我们想证明下一个sg值为下一个odious数。注意到我们总能够在第x位置翻转硬币到达sg为0的情况;通过翻转第x位置的硬币和两个其它硬币,我们可以移动到所有较小的evil数,因为每个非零的evil数都可以由两个odious数异或得到;但是我们不能移动到下一个odious数,因为任何两个odious数的异或都是evil数。

 

假设在一个Mock Turtles游戏中的首正硬币位置x1,x2,…,xn是个P局面,即sg[x1]^…^sg[xn]=0.那么无可置疑的是n必定是偶数,因为奇数个odious数的异或是odious数,不可能等于0。而由上面可知sg[x]是2x或者2x+1,sg[x]又是偶数个,那么x1^x2^…^xn=0。相反,如果x1^x2^…^xn=0且n是偶数,那么sg[x1]^…^sg[xn]=0。这个如果不太理解的话,我们可以先这么看下。2x在二进制当中相当于把x全部左移一位,然后补零,比如说2的二进制是10,那么4的二进制就是100。而2x+1在二进制当中相当于把x全部左移一位,然后补1,比如说2的二进制是10,5的二进制是101。现在看下sg[x1]^…^sg[xn]=0,因为sg[x]是2x或者2x+1,所以式子中的2x+1必须是偶数个(因为2x的最后一位都是0,2x+1的最后一位都是1,要最后异或为0,2x+1必须出现偶数次)。实际上的情况可能是这样的:

MT游戏当中的P局面是拥有偶数堆石子的Nim游戏的P局面。

// Time 15ms; Memory 304K
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n,a[110],s,i,t,p;
while(cin>>n)
{
s=0;
for(i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);
for(i=0;i<n;i++) if(i==0 || a[i]!=a[i-1])
{
t=a[i];p=0;
while(t)
{
if(t%2) p++;
t/=2;
}
if(p%2) s^=2*a[i];
else s^=2*a[i]+1;
}
if(s) cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
return 0;
}

最新文章

  1. 从随机过程到马尔科夫链蒙特卡洛方法(MCMC)
  2. Python之路Day14--html
  3. 搭建vpn环境:centos7+openvpn
  4. PDA 收银系统PDA手持打印扫描枪 销售开单 收银 扫描打印一体机
  5. [原创]用“人话”解释不精确线搜索中的Armijo-Goldstein准则及Wolfe-Powell准则
  6. 线段树 + 矩阵 --- ZOJ 3772 Calculate the Function
  7. asp.net mvc UpdateModel 更新对象后出现null
  8. Remote Desktop Connection Manager (RDCMan) 介绍
  9. Android广播BroadcastReceiver 二
  10. Oracle 分析函数 &quot;ORA-30485: 在窗口说明中丢失 ORDER BY 表达式&quot;
  11. Excel 公式(细节若干)
  12. 翻译:JVM虚拟机规范1.7中的运行时常量池部分(一)
  13. obj-c编程12:复制对象
  14. SQL中的ALL,ANY,SOME的用法
  15. Maven学习 五 Maven项目创建(1)jar项目
  16. (转)Eclipse配置GitHub代码库(以Windows7为例)
  17. 使用CSS定位元素实现水平垂直居中效果
  18. springboot创建一个可执行的jar
  19. URL传入带有%的参数的解决方法
  20. Python中的运算符与表达式

热门文章

  1. SQL SERVER 2008递归
  2. Qt状态机框架(状态机就开始异步的运行了,也就是说,它成为了我们应用程序事件循环的一部分了)
  3. 关于中国省市的一份js代码
  4. 我的Android进阶之旅------>Android视频录制小例子
  5. Django之表单验证
  6. valuestack,stackContext,ActionContext.之间的关系以及action的数据在页面中取得的方法
  7. mysql怎么在已建好的表中添加自增序列
  8. python3函数内全局变量使用global
  9. fields_for
  10. nginx rewrite标签配置以及用户认证配置