「Cfz Round 3」Battle 题解

· · 题解

更好的观看体验

题目传送门

题目大意

有两个数 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;//完结撒花! } ```