题目大意
洛谷链接
现在两个人做游戏,每个人刚开始都是数字(1),谁赢了就能乘以(k^2),输的乘以(k),现在给你最终这两个人的得分,让你判断是否有这个可能,有可能的话输出Yes
,否则输出No
。
输入格式
第一行是数据组数(n)。
接下来(n)行每行给出两个数(a)和(b),表示两个人的最终得分。
数据范围
(1le nle 350000,1le a,ble 10^9)
输出格式
输出(n)行分别为各组的结果。
样例输入
6
2 4
75 45
8 8
16 16
247 994
1000000000 1000000
样例输出
Yes
Yes
Yes
No
No
Yes
思路
无论每轮谁赢谁输,结果乘起来之后一定能整除(k^3)。
经过一定轮数后,得到(a、b),则(a、b)一定满足:
(a×b=k_1^3+k_2^3+k_3^3cdots)
则把(a)和(b)相乘后开立方即可。
代码
#include<bits/stdc++.h>
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
int a,b;
scanf("%d%d",&a,&b);
int k=cbrt((double)a*(double)b);//cbrt是cmath库里的开立方函数
int x=a/k,y=b/k;
if(x*x*y==a&&y*y*x==b)puts("Yes");
else puts("No");//实测puts比printf要快一点,不过在本题也没啥区别
}
return 0;
}