Codeforces Round #426 (Div. 2) C. The Meaningless Game
原创
©著作权归作者所有:来自51CTO博客作者Nemaleswang的原创作品,请联系作者获取转载授权,否则将追究法律责任
题目链接:The Meaningless Game
题目大意:有两个数,初始值都是1,现在他们可以互相博弈很多轮,赢的人可以在原本值得基础上乘上一个k*k,输方可以乘上一个k,k的值每一轮都可以不同,然后给你一个n和m,代表很多轮之后他们的得分,问这个得分是否合法
题目思路:很容易可以想到每一轮得分乘积的贡献都是一个k* k k,那么很多轮后就是,k1 k1 * k1 * k2 * k2 k2 … * kn * kn * kn,也就是说实际上是(k1 * k2 * … * kn) 的三次方,也就是说最终n *m的值一定为一个整数的三次方,然后看一下n和m的范围是1e9,也就是这个整数不会大于1e6,那么我们可以考虑二分去求解是否存在这样的一个值满足条件,有就Yes,否则就No就好了
#include <map>
#include <cmath>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e6+10;
ll sum,n,m;
int t;
int main(){
scanf("%d",&t);
while(t--){
scanf("%lld%lld",&n,&m);
sum = n*m;
ll l = 0ll,r = (ll)maxn;
ll mid,ans;
while(l <= r){
mid = l+r>>1;
if(mid*mid*mid >= sum) ans = mid,r = mid-1;
else l = mid+1;
}
if(ans*ans*ans == sum&&n%ans == 0&&m%ans == 0) puts("Yes");
else puts("No");
}
return 0;
}