博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ】4147: [AMPPZ2014]Euclidean Nim
阅读量:5807 次
发布时间:2019-06-18

本文共 1362 字,大约阅读时间需要 4 分钟。

【算法】博弈论+数论

【题意】给定n个石子,两人轮流操作,规则如下:

轮到先手操作时:若石子数<p添加p个石子,否则拿走p的倍数个石子。记为属性p。

轮到后手操作时:若石子数<q添加q个石子,否则拿走q的倍数个石子。记为属性q。

拿走所有石子的人胜利,问先手是否必胜,或输出游戏会永远进行下去。

【题解】学习自: by popoqqq

首先博弈过程可以表示为不定方程ap+bq=n

然后由扩欧可知此方程有解当且仅当gcd(a,b)|n,无解则永远进行下去。

方程有解时,两边同除gcd简化运算,p/=d,q/=d,n/=d,此时p,q互质,由于方程有解,一定能拿完,那么考虑谁先拿完。

 

对于一个状态(p,q,n)表示先手操作属性p,后手操作属性q,当前剩余n石子,p>q,有以下两种重要情况:

★1.n<p,先手必败。

证明:(p,q,n)--->(q,p,n+p)--->(p,q,(n+p)%q),由于(n+p)%q<q,所以先手方p只能被迫一直增加,最终一定由q方拿完。

★2.n>p,当且仅当(p-q)|(n%p)&&(n%p<q)时先手必胜。

证明:若n%p>=q,那么就回到了第一种情况的第二步,先手必败。

若n%p<q,则先手必须取模到比q小避免必败,然后后手就被迫+q,先手再-p,后手再+q。

如此每次循环石子堆都会减少(p-q),如果减少到0则先手胜,如果直接减到负数其实就是不够-p的情况,则又回到情况1的第二步,先手必败。

所以当且仅当(p-q)|(n%p)&&(n%p<q)时先手必胜。

 

讨论完重要情况后,开始对问题本身分情况讨论:

1.p=q=1时,先手必胜。

2.p>q,p>n,回归重要情况1,先手必败。

3.p>q,p<=n,回归重要情况2,当且仅当(p-q)|(n%p)&&(n%p<q)时先手必胜。

4.p<q,p>n,先手被迫+p,若n+p<q,后手回归重要情况1,先手必胜。若n+p>=q,后手回归重要情况2,当且仅当(q-p)|((n+p)%q)&&((n+p)%q<p)时先手必败。

5.p<q,p<=n,先手变成n%p,后手回归重要情况1,先手必胜。

#include
#include
#include
using namespace std;int gcd(int a,int b){
return !b?a:gcd(b,a%b);}bool calc(int p,int q,int n){
return n%p
q&&p>n)printf("P\n");else if(p>q&&p<=n){
if(calc(p,q,n))printf("E\n");else printf("P\n");}else if(p
n){
if(n+p
View Code

 

转载于:https://www.cnblogs.com/onioncyc/p/7249524.html

你可能感兴趣的文章
记一次Git异常操作:将多个repository合并到同一repository的同一分支
查看>>
CodeIgniter 3.0 新手捣鼓源码(一) base_url()
查看>>
Chrome 广告屏蔽功能不影响浏览器性能
查看>>
vSphere 6将于2月2日全球同步发表
查看>>
Android状态栏实现沉浸式模式
查看>>
让你的APP实现即时聊天功能
查看>>
iOS 绝对路径和相对路径
查看>>
stat
查看>>
报空指针异常
查看>>
如何配置mysql的超时时间
查看>>
Java_spark简单例子
查看>>
imshow(K)和imshow(K,[]) 的区别
查看>>
poj3190 Stall Reservations
查看>>
CORS 跨域问题, 以及作为api server 的正确配置, 后台 nginx 配置
查看>>
loadrunner录制脚本、回放脚本遇到的问题
查看>>
16进制数至字符串转换
查看>>
Java Web整合开发(13) -- XML
查看>>
标准库Queue的实现
查看>>
如何使用Python3.4连接MySQL
查看>>
automake,autoconf使用详解
查看>>