已经想到了,却不知道怎么处理,哎
设 每 次 乘 的 数 是 k 1 , k 2 , k 3 . . . . . . . k n 设每次乘的数是k_1,k_2,k_3.......k_n 设每次乘的数是k1,k2,k3.......kn
设 a = k 1 2 k 2 2 k 3 k 4 k n 设a=k_1^2k_2^2k_3k_4k_n 设a=k12k22k3k4kn
那 么 b = k 1 k 2 k 3 2 k 4 2 k n 2 那么b=k_1k_2k_3^2k_4^2k_n^2 那么b=k1k2k32k42kn2
问 题 就 在 这 里 , 我 开 始 想 的 是 求 出 a , b 的 g c d 问题就在这里,我开始想的是求出a,b的gcd 问题就在这里,我开始想的是求出a,b的gcd
那 么 a / g c d = k 1 k 2 , b / g c d = k 3 k 4 k 5 那么a/gcd=k_1k_2,b/gcd=k_3k_4k_5 那么a/gcd=k1k2,b/gcd=k3k4k5
所 以 新 的 a ∗ b = = g c d 所以新的a*b==gcd 所以新的a∗b==gcd
但是完全不对呀哎,毕竟k1,k2,k3…间可能也有公因子,求出来的gcd会更大
所 以 注 意 到 a ∗ b = k 1 3 k 2 3 . . . k n 3 \color{Red}所以注意到a*b=k_1^3k_2^3...k_n^3 所以注意到a∗b=k13k23...kn3
所 以 把 a ∗ b 开 三 次 方 得 到 整 数 t e m p 所以把a*b开三次方得到整数temp 所以把a∗b开三次方得到整数temp
且 啊 t e m p 是 a , b 的 因 子 且啊temp是a,b的因子 且啊temp是a,b的因子
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,a,b;
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
map<int,int>m;
signed main()
{
int temp=1,sumn;
while(1)
{
sumn=temp*temp*temp;
if(sumn>1e17) break;
m[sumn]=temp,temp++;
}
cin >> n;
while(n--)
{
scanf("%lld%lld",&a,&b);
int s=a*b;
if(m[s]&&a%m[s]==0&&b%m[s]==0) printf("YES\n");
else printf("NO\n");
}
}