【算法】博弈论+数论

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

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

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

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

【题解】学习自:BZOJ 4147 AMPPZ2014 Euclidean Nim 博弈论+数论 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<cstdio>
#include<algorithm>
#include<cstring>
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&&(n%p)%(p-q)==;}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int p,q,n;
scanf("%d%d%d",&p,&q,&n);
int d=gcd(p,q);
if(n%d!=){printf("R\n");continue;}
p/=d;q/=d;n/=d;
if(p==q)printf("E\n");else
if(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<q&&p>n){if(n+p<q)printf("E\n");else{if(calc(q,p,n+p))printf("P\n");else printf("E\n");}}else
if(p<q&&p<=n)printf("E\n");
}
return ;
}

【BZOJ】4147: [AMPPZ2014]Euclidean Nim的更多相关文章

  1. Bzoj 4147: [AMPPZ2014]Euclidean Nim(博弈)

    4147: [AMPPZ2014]Euclidean Nim Time Limit: 1 Sec Memory Limit: 256 MB Description Euclid和Pythagoras在 ...

  2. BZOJ 4147: [AMPPZ2014]Euclidean Nim (分类讨论博弈神题)

    orz PoPoQQQ神犇,每一篇题解都写得很清楚 (看了PoPoQQQ的哲♂学三部曲,瑟瑟发抖) CODE #include <cstdio> #include <algorith ...

  3. 【BZOJ】3105: [cqoi2013]新Nim游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=3105 题意:k堆火柴,先手和后手在第一次拿的时候都能拿若干整堆火柴(但不能拿完),之后和nim游戏规 ...

  4. 【BZOJ】4152: [AMPPZ2014]The Captain【SLF优化Spfa】

    4152: [AMPPZ2014]The Captain Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 2107  Solved: 820[Submi ...

  5. 【BZOJ】4144: [AMPPZ2014]Petrol

    题意 给定一个\(n\)个点.\(m\)条边的带权无向图,其中有\(s\)个点是加油站.每辆车都有一个油量上限\(b\),即每次行走距离不能超过\(b\),但在加油站可以补满.\(q\)次询问,每次给 ...

  6. 【BZOJ】3052: [wc2013]糖果公园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...

  7. 【BZOJ】3319: 黑白树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...

  8. 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...

  9. 【BZOJ】1013: [JSOI2008]球形空间产生器sphere

    [BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...

随机推荐

  1. LintCode-204.单例

    单例 单例 是最为最常见的设计模式之一.对于任何时刻,如果某个类只存在且最多存在一个具体的实例,那么我们称这种设计> 模式为单例.例如,对于 class Mouse (不是动物的mouse哦), ...

  2. iOS- 无处不在,详解iOS集成第三方登录(SSO授权登录<无需密码>)

    1.前言   不多说,第三登录无处不在!必备技能,今天以新浪微博为例. 这是上次写的iOS第三方社交分享:http://www.cnblogs.com/qingche/p/3727559.html 可 ...

  3. cacti设置redis监控端口

    1.在Console->Data Templates中选择Redis的模版 在custom Data中勾选中Port2并保存 2.在Console->Data Input Methods中 ...

  4. 【转】Jsp自定义标签详解

    一.前言 原本是打算研究EXtremeComponents这个jsp标签插件,因为这个是自定义的标签,且自身对jsp的自定义标签并不是非常熟悉,所以就打算继续进行扫盲,开始学习并且整理Jsp自定义标签 ...

  5. Tomcat启动报错ERROR:transport error 202:bind failed:Address already

    昨天在服务器上拷贝了一个tomcat项目,修改了server.xml之后启动居然报错ERROR:transport error 202:bind failed:Address already,应该是远 ...

  6. 累积下学习 C#时和 Java时的不同点

    ==和equals()方法的区别: 首先有一个观点: 这两个都是用来比较值是否相等的 ( 这里的值有时候指的是地址值, 有时候是存储的值; 下面将地址值称为地址, 存储的值称为值 ) 在Java中: ...

  7. 【数据库】】MySQL之desc查看表结构的详细信息

    在mysql中如果想要查看表的定义的话:有如下方式可供选择 1.show create table 语句: show create table table_name; 2.desc table_nam ...

  8. hdu2121-Ice_cream’s world II

    给出一个有向图,求最小树形图和它的最小的根. 分析 这个题又写了一晚上-我之前的朱刘算法写法是我乱想的,只有那道题可以过--所以去找了一份代码来看,发现我的写法超级麻烦啊,所以就学习了一下那种写法,非 ...

  9. (一)Redis简介及安装

    Redis简介 Redis 是一个开源(BSD许可)的,内存中的key-value数据结构存储系统,它可以用作数据库.缓存和消息中间件. Redis具有丰富的数据结构类型.包括字符串(string), ...

  10. 【题解】51nod 1686第K大区间

    成功的秘诀,在于克服自己看题解的冲动……[笑哭].自己A掉这题还是灰常开心的~ 以及爱死 two - pointer ! two - pointer 大法是真的好哇……这个题目有上一题的经验:求第\( ...