if(a*a%b == 0&&b*b%a == 0) 这一步特别重要
例如3,7. 他们的积是21.符合要求3*3*3=21.但是应该输出no。
因为7和3无法由k累乘获得。我们要保证a和b有同一个约数。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
long long mid;
bool find(ll m)
{
int l = 1,r = 1e6;//1e6的三次幂就是1e18,正好是1e9的平方
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(find(a*b))
{
if((a%mid==0||mid%a==0)&&(b%mid==0||mid%b==0))
printf("YES\n"); //能找到某个数的3次方等于a*b只是必要条件,还要加上上面一条才可以
else
printf("NO\n");
}
else
{
printf("NO\n");
}
}
return 0;
}