异或解决取石子问题

1. 首先给出下面会用到的几条异或的性质

性质1:异或满足交换律,结合律

性质2:如果a<2^t  那么有a xor 2^t=a+2^t,如果a的最高非零位为i,那么a xor 2^i =a-2^i

性质3:如果a<2^t  b<2^t 那么(a xor b)+2^t=a xor (b+2^t)

证明:a<2^t  b<2^t 则a xor b<2^

      由性质2有 (a xor b)+2^t=a xor b xor 2^t=a xor (b+2^t)

性质4:对任意a,偶数个a异或结果为0,奇数个a异或结果为a

 


 

2.对一个非负整数序列定义平衡态和非平衡态

对n个非负整数序列A1,A2,...An

令T=A1 xor A2 xor ... xor An

    Ti=T xor Ai

定义平衡态为T=0 非平衡态为T>0

 


 

3.证明必然存在从非平衡态到平衡态的转化

假设现在有T>0 我们证明必然存在t使得At>Tt

设A1 A2 ... An对应的二进制数中,最大数的最高非零位为i   并且设有m个数的最高非零位也是i

(1)当m为奇数

设At是其中的一个数,At>=2^i

那么剩下的数字有m-1个大于2^i的数字 因为m-1为偶数 所以这m-1个数字异或的值<2^i

其他n-m个小于2^i的数字异或的值<2^i

所以Tt=T xor At<2^i

所以At>Tt


(2)当m为偶数

不失一般性,假设A1 ... Am为这样的数字

T=A1 xor A2 xor ... xor Am xor ...xor An

=(A1 xor 2^i) xor (A2 xor 2^i) xor ... xor (Am xor 2^i) ... xor An

=B1 xor B2 xor ... xor Bm xor Am+1 xor ... xor An

其中Bt=At-2^i       t=1,2,...,m

如果序列B1 B2...An 满足(1)那么问题得解

否则继续做(2)的操作 直到满足(1)为止

我们选取此时序列为C1 xor C2 xor ... xor C? xor ... xor An

那么C1是A1与一系列的2^i异或后得到的

也就是说A1=C1+2^i1+2^i2+2^ix   i1>i2>...>ix

因为C1>T xor C1 所以T xor C1<2^ix

那么C1+2^i1+2^i2+...+2^ix>(T xor C1)+2^i1+2^i2+...+2^ix=T xor A1

则A1>T xor A1=Ti


现在我们只要从At中取走At-Tt就能保证T=0

T=Tt xor (At-(At-Tt))=Tt xor Tt=0

问题得证

 


 

4.证明必然存在从平衡态到非平衡态的转化

对任意一个At 从中拿走任意x      0<x<At

因为T=Tt xor At=0 所以Tt=At

现在拿走x后 必然有Tt!=At

也就是T!=0

问题得证

 


 

5.取石子问题

在上面的证明中,我已经证明了必然存在从平衡态到非平衡态的转化

下面我们看看这样的结论在经典的取石子问题中的应用

    ( 取 石 子 游 戏 1) 任给N堆石子,两人轮流从任一堆中任取(每次只能取自一堆),取最后一颗石子的人获胜,问先取的人如何获胜?

根据上面所述,如果开始的时候T=0,那么没有获胜的可能,如果开始的时候T>0,那么只要每次取出石子使得T=0即可

   ( 取 石 子 游 戏 2) 任给N堆石子,两人轮流从任一堆中任取(每次只能取自一堆),规定每方每次最多取K颗,取最后一颗石子的一方获胜.问先取的人如何获胜?

与上面的问题比,这个更复杂一些,我们可以这样做

令Bi=Ai mod(K+1)

定义T‘=B1 xor B2 xor ... xor Bn

如果T‘=0 那么没有获胜可能

如果T’>0  那么必然存在取的方法,使得T‘=0

假设对方取了在Ai中取了r<=K个

如果Ai中剩下的石子多于K 那么就在Ai中取走K+1-r个 则Bi不变 T‘还是0

如果Ai<=K 那么我们需要重新计算Bi和T‘ 按照上面的方法来做就可以了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值