题解:
(
k
n
)
(k^n)
(kn)
3
^3
3=
a
∗
b
a*b
a∗b,呢么判断
i
n
t
(
p
o
w
(
a
∗
b
,
1.0
/
3.0
)
)
3
int(pow(a*b,1.0/3.0))^3
int(pow(a∗b,1.0/3.0))3 =
a
∗
b
a*b
a∗b 以及
a
a
a%
k
n
k^n
kn =
0
0
0,
b
b
b%
k
n
k^n
kn = 0 即可,因为
n
n
n 轮,每轮必
∗
k
*k
∗k,故需要判断
k
n
k^n
kn 对
a
,
b
a,b
a,b是否合法。
参考代码:
#include<iostream>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<unordered_map>
#include<unordered_set>
#include<set>
#include<cstdlib>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<set>
using namespace std;
typedef long long ll;
const int maxn=2e5+5;
const int N=5e2+5;
void read(int &v)
{
int k = 1;
v = 0;
int c = getchar();
while (c < '0' || c > '9')
{
if (c == '-')
k = 0;
c = getchar();
}
while (c >= '0' && c <= '9')
v = (v << 3) + (v << 1) + (c - 48), c = getchar();
if (k == 0)
v = -v;
}
ll ksm(ll a,ll b)
{
ll res=1;
while(b)
{
if(b&1)
res*=a;
b>>=1;
a=a*a;
}
return res;
}
int main()
{
int T;
read(T);
while(T--)
{
int a,b;
bool fla=false;
read(a),read(b);
ll sum=(ll)a*(ll)b;
ll l=1ll,r=1000000ll,ans=0.0;
while(l<=r)
{
ll mid=l+r>>1;
if(sum==ksm(mid,3ll)){
fla=true;
ans=mid;
break;
}
if(ksm(mid,3ll)>sum)
r=mid-1ll;
else
l=mid+1ll;
}
if(fla&&a%ans==0&&b%ans==0)
puts("Yes");
else
puts("No");
}
return 0;
}