Crashing Balloon
现有编号为1-100的气球,在游戏中每个人的得分是他踩破气球的数字的乘积,但并不是每个人都会如实计算自己的得分(可能为了赢,报更高的分数)。已知低分的人不能说谎,高分的人可能说谎,低分的人可以质疑高分的人,如果质疑成功(高分的人确实说谎了),那么低分的人赢得比赛,否则高分的人赢得比赛。
e.g 343和49,343只能由49*7得来,49只能由49得来,这两个分数是不可能同时存在的,故高分的人说谎了,低分的人赢得比赛。
思路:
看两个数有没有
[
1
,
100
]
[1,100]
[1,100]内的重复的因子
dfs两个数字的因子,如果两个数都能变为1,则无人说谎(没有重复因子)
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
const int INF=0x3f3f3f3f;
typedef long long ll;
int f1,f2;
void dfs(int a,int b,int k){
if(f1) return;//高分的人没有说谎,则直接高分的人赢
if(a==1&&b==1){
f1=1,f2=1;
return;
}
if(a!=1&&b==1){
f2=1;//不能return,继续搜,a还有可能变为1
}
if(k<1) return;
if(a%k==0) dfs(a/k,b,k-1);因子k,被a用不被b用
if(b%k==0) dfs(a,b/k,k-1);因子k,被b用不被a用
dfs(a,b,k-1);//因子k,既不被a用又不被b用
}
int main(){
int x,y;
while(cin>>x>>y){
if(x<y) swap(x,y);
f1=0,f2=0;
dfs(x,y,100);
if(!f1&&f2) cout<<y<<endl;
else cout<<x<<endl;
}
return 0;
}