题目描述
题解
这题好难想啊,这么多情况根本想不全
也许还是脑子太混乱了?
抄了一点Po姐的题解…
首先当
n
不能整除
因为无论如何没有公共部分的质因子无法完全消去
如果游戏可以结束那么令
n/gcd(p,q),p/gcd(p,q),q/gcd(p,q)
显然与之前等价
下面开始分类讨论
状态1:
p=q
此时
p=1
,先手必胜
状态2:
p>q
且
n<p
此时先手必败
显然先手第一次必须
+p
,后手只需要每次
%q
就能保证先手永远无法取
由于贝祖定理,
n,p,q
互质,一定存在
k
使
状态3:
p>q
且
n≥p
此时先手必胜当且仅当
n%p<q
且
(p−q)|(n%p)
显然如果先手操作后石子数
x≥q
,那么后手只需要将石子数变为
x%q
,就转化成了状态2,先手必败
因此先手必胜只有可能如此操作:
先手取成
n%p
-> 后手
+q
-> 先手
−p
-> 后手
+q
-> …
那么一轮下来,石子数
x
变为了原来的
故当
n%p<q
且
(p−q)|(n%p)
时先手必胜
状态4:
p<q
且
n<p
此时先手必胜当且仅当(
n+p<q
)或者(
(n+p)%q<p
且
(q−p)|(n+p)%q
)
先手第一次操作只能是
+p
那么如果
n+p<q
,则后手只能
+q
,先手
%p
后转化为状态2,先手必胜
否则转化为状态3
状态5:
p<q
且
n≥p
先手必胜
先手将石子数取为
n%p
后转化为状态2
分类讨论能力还是太tm辣鸡了
也许应该多做做山东卷的高考题?
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int T,n,p,q,t;
int gcd(int a,int b)
{
if (!b) return a;
else return gcd(b,a%b);
}
int main()
{
scanf("%d",&T);
while (T--)
{
scanf("%d%d%d",&p,&q,&n);
t=gcd(p,q);
if (n%t) {puts("R");continue;}
p/=t,q/=t,n/=t;
if (p==q) puts("E");
if (p>q)
{
if (n>=p)
{
if (n%p<q&&n%p%(p-q)==0) puts("E");
else puts("P");
}
else puts("P");
}
if (p<q)
{
if (n>=p) puts("E");
else
{
if (n+p<q) puts("E");
else
{
if ((n+p)%q<p&&(n+p)%q%(q-p)==0) puts("P");
else puts("E");
}
}
}
}
}