「Cfz Round 3」Battle 题解
BGM114514
·
·
题解
更好的观看体验
题目传送门
题目大意
有两个数 n,m ,从 m 开始,每次把一个数减去这个数模 p 。如果是 n 先变成 0 ,输出 Bob ; 如果是 m 先变成 0 ,输出 Alice ;若 n,m 在 10^{10^{9961}} 操作后还是大于 0 (其实就是永远啦),那么报告平局。
解题思路
首先我们来思考取模的性质(设 h 为被模数, p 为模数):
所以,当 $h<p$ 时,$h \bmod p$ 等于 $h$ 。
也就是说,如果轮到一个数减的时候,它已经小于 $p$ 了,那么这个数一定会变成 $0$ ,直接输出。
如果它大于等于 $p$ 呢?那么,它在这一轮就会减去模 $p$ 的余数,从而变成 $p$ 的整数倍。然后它就会不停减 $0$ 导致永远无法变成 $0$ 。
### 于是,我们的思路就出现了:
如果 $n,m$ 都大于等于 $p$ ,直接报告平局。
如果 $n<p$ 且 $m\ge p$ ,那么 Bob 获胜。
如果 $m<p$ 且 $n\ge p$ ,那么 Alice 获胜。
如果 $n,m$ 都小于 $p$ ,那么先手——即 Alice 获胜。
## 那么,上代码!
[AC 记录](https://www.luogu.com.cn/record/141588768)
```cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
int T;
scanf("%lld",&T);//数据组数
while(T--){
int n,m,p;
scanf("%d%d%d",&n,&m,&p);//输入
if(n>=p&&m>=p){//n,m 都大于等于 p
printf("Lasting Battle\n");//报告平局
}
if(n<p&&m>=p){
printf("Bob\n");//Bob 获胜
}
if(m<p&&n>=p){
printf("Alice\n");//Alice 获胜
}
if(n<p&&m<p){
printf("Alice\n");//先手——即 Alice 获胜
}
}
return 0;//完结撒花!
}
```