游戏
题目
有一天, krydom 和 darkflames 在 Van You See 。
一开始,2 个人的分数都是 1 。
每一个回合,可以任意选择一个数 k,然后 krydom 和 darkflames 猜拳,
赢的人把自己的分数 *k^2,输的人把自己的分数 *k。
但是 krydom 变成了老年选手,记忆力衰退,一共(仿佛)回忆起了 n 局
比赛的最后两个人的分数 Xi, Yi,但是不确定。现在 krydom 想知道对于这 n
场比赛,每场比赛的最后结果是否有可能是 Xi, Yi。 【输入格式】
第一行包含一个整数 n ,表示比赛的局数。
接下来 n 行,每行两个整数 Xi, Yi,表示一个询问。 【输出格式】
一共 n 行,每行输出 Yes 或者 No 。
表示第 i 场比赛的结果是否有可能是 Xi, Yi 。 【输入输出样例】
Input1
3
2 4
75 45
8 8
Output1
Yes
Yes
Yes
Input2
3
16 16
247 994
1000000000 1000000
Output2
No
No
Yes
NOIP2019 模拟赛
第 8页 共 8页
【样例解释】
样例 1 解释:
1、2 = 2 4 = (2*2)
2、75 = (5*5)*3 49 = 5*(3*3)
3、8 = 2*(2*2) 8 = (2*2)*2
【数据范围】
对于 20% 的数据满足:n ≤ 10, Xi, Yi ≤ 10 。
对于 50% 的数据满足:x ≤ 350000, Xi, Yi ≤ 100 。
对于 100%的数据满足:n ≤ 350000, Xi, Yi ≤ 10^9
思路
设 tmp =a*b的立方根。
如果 tmp 不是整数,显然是 No
否则怕判断 tmp 是不是 a 和 b 的因数
如果 tmp 不是 a 的因数或者不是 b 的因数,就是
No
否则都是 Yes
代码
#include<bits/stdc++.h> using namespace std; long long a, b, tmp, ans; int n; void work() { scanf("%lld%lld",&a,&b); tmp=a*b;ans=0; int l=1,r=1e6; while(l<=r) { long long mid=(l+r)>>1; if(mid*mid*mid==tmp) { ans=mid; break; } if(mid*mid*mid<tmp) l=mid+1; else r=mid-1; } if(!ans) { cout<<"No"<<endl; return; } if(a%ans==0&&b%ans==0) cout<<"Yes"<<endl; else cout<<"No"<<endl; } int main() { scanf("%d",&n); while (n--) work(); return 0; }