【纯水题】CF 833A The Meaningless Game
题目大意
洛谷链接
现在两个人做游戏,每个人刚开始都是数字\(1\),谁赢了就能乘以\(k^2\),输的乘以\(k\),现在给你最终这两个人的得分,让你判断是否有这个可能,有可能的话输出Yes
,否则输出No
。
输入格式
第一行是数据组数\(n\)。
接下来\(n\)行每行给出两个数\(a\)和\(b\),表示两个人的最终得分。
数据范围
\(1\le n\le 350000,1\le a,b\le 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^3\cdots\)
则把\(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;
}