【BZOJ】4147: [AMPPZ2014]Euclidean Nim
【算法】博弈论+数论
【题意】给定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的更多相关文章
- Bzoj 4147: [AMPPZ2014]Euclidean Nim(博弈)
4147: [AMPPZ2014]Euclidean Nim Time Limit: 1 Sec Memory Limit: 256 MB Description Euclid和Pythagoras在 ...
- BZOJ 4147: [AMPPZ2014]Euclidean Nim (分类讨论博弈神题)
orz PoPoQQQ神犇,每一篇题解都写得很清楚 (看了PoPoQQQ的哲♂学三部曲,瑟瑟发抖) CODE #include <cstdio> #include <algorith ...
- 【BZOJ】3105: [cqoi2013]新Nim游戏
http://www.lydsy.com/JudgeOnline/problem.php?id=3105 题意:k堆火柴,先手和后手在第一次拿的时候都能拿若干整堆火柴(但不能拿完),之后和nim游戏规 ...
- 【BZOJ】4152: [AMPPZ2014]The Captain【SLF优化Spfa】
4152: [AMPPZ2014]The Captain Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 2107 Solved: 820[Submi ...
- 【BZOJ】4144: [AMPPZ2014]Petrol
题意 给定一个\(n\)个点.\(m\)条边的带权无向图,其中有\(s\)个点是加油站.每辆车都有一个油量上限\(b\),即每次行走距离不能超过\(b\),但在加油站可以补满.\(q\)次询问,每次给 ...
- 【BZOJ】3052: [wc2013]糖果公园
http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...
- 【BZOJ】3319: 黑白树
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...
- 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...
- 【BZOJ】1013: [JSOI2008]球形空间产生器sphere
[BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...
随机推荐
- C++第一次课堂作业 circle
Github上的代码提交
- button type=“submit”
写js遇到任何怪异的行为 一定要先看看是不是submit搞的鬼. 函数内部最后总是返回 return false; 也是一个好的习惯
- Node js MongoDB简单操作
//win7环境下node要先安装MongoDB的相关组件(非安装MongoDB数据库),在cmd命令行进入node项目目录后执行以下语句 //npm install mongodb //创建连接 v ...
- java 基础 --集合--012
1, 数组与集合 A:长度不同 数组的长度固定,集合的长度可变 B:内容不同 数组里存储的是同一种类型的元素,而集合可以存储不同类型的元素 C:元素的数据类型问题 数组可以存储基本数据类型,也可以存储 ...
- arp_annouce=2详解
arp_annouce=0的时候 手册上说的是到底是是说当我这个包出去的时候询问arp地址, 当arp_announce=0的时候,是说使用数据包中的地址去进行arp的请求, 当arp_announc ...
- 从HR 到SBP其实还有很长的一段路要走
战略性业务伙伴 Strategic business partners 关于这本书,一般是因为好奇,从HR到BP的角色,再到这个SBP,其实是一段没有走过的很虚的过程,不过总归是需要灯塔,即使偶尔只是 ...
- Qt安装与入门
一.Qt SDK1.2安装 准备QtSdk-offline-win-x86-v1_2_1.exe离线安装包. 安装QtSDK时注意不要有中文路径,空格以及特殊字符.可以自定义选择组件安装,也可以默认安 ...
- servlet的service特性就是http协议的特性 即连接完就断开
servlet的service特性就是http协议的特性 即连接完就断开
- BZOJ 1055 玩具取名(区间DP)
很显然的区间DP,定义dp[i][j][k], 如果dp[i][j][k]=1表示字符串[i,j]可以组成k字符. # include <cstdio> # include <cst ...
- 【bzoj4229】选择 离线+LCT
题目描述 现在,我想知道自己是否还有选择. 给定n个点m条边的无向图以及顺序发生的q个事件. 每个事件都属于下面两种之一: 1.删除某一条图上仍存在的边 2.询问是否存在两条边不相交的路径可以从点u出 ...