题目链接:codeforces.com/contest/834/problem/C
题目大意:两个人玩游戏,两个人的初始积分都为1,游戏有很多轮,每一轮赢得用积分*k^2,输的积分*k,最后的积分分别为a和b,你来判断最后的得分是否合理。
题目思路:思考之后就会发现积分的乘积为某个数的立方,所以通过二分的方法查找这个数,当然还要加别的判断条件,为了确保a,b中是满足题目要求的做法,所以加上a*a%b==0 b*b%a==0的判断条件
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
bool find(ll m)
{
int l = 1,r = 1e6;//1e6的三次幂就是1e18,正好是1e9的平方
ll mid;
while(l<= r)//二分查找
{
mid = (l+r)/2;
if(mid*mid*mid == m)
return 1;
if(mid*mid*mid< m)
l = mid+1;
else
r = mid-1;
}
return 0;
}
int main()
{
int n;
cin>>n;
while(n--)
{
ll a,b;
scanf("%lld %lld",&a,&b);
if(a*a%b == 0&&b*b%a == 0&&find(a*b))//前两个条件是很重要的,这样保证了每一次round,都是按照k^2和k,这样分的
printf("YES\n"); //能找到某个数的3次方等于a*b只是必要条件,还要加上上面一条才可以
else
printf("NO\n");
}
return 0;
}