思路
看了别人的题解才恍然大悟啊……赢的人乘k方,输的人乘k,那么a和b乘起来肯定是等于某个数的三次方的, 不过我还是给大家提供另外一种思路吧(我感觉不用动脑)——唯一分解定理。 我们先把a和b唯一分解,假设某一局的k贡献在了a和b的因子p上面,那么其指数k1,k2肯定会满足下面式子的
(k1%3+k2%3)%3==0&&k1<=2*k2&&k2<=2*k1)
然后我们对于所有因子都判一遍(别忘了最后的大质数)就可以了。
### 代码
```cpp
//#pragma GCC optimize("Ofast", "inline", "-ffast-math")
//#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define int long long
using namespace std;
const int N=1e6+7;
const int mod=1e9+7;
//int read(){ int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=f*-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;}
int t,a,b;
int pri[N],np[N],cnt=0;
void init(){
for(int i=2;i<N;i++){
if(!np[i]) pri[++cnt]=i;
for(int j=1;j<=cnt&&pri[j]*i<N;j++){
np[pri[j]*i]=1;
if(i%pri[j]==0) break;
}
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
init();
cin>>t;
while(t--){
cin>>a>>b;
int flag=0;
for(int i=1;i<=cnt;i++){
int k1=0,k2=0;
while(a%pri[i]==0){
a/=pri[i];
k1++;
}
while(b%pri[i]==0){
b/=pri[i];
k2++;
}
if(!((k1%3+k2%3)%3==0&&k1<=2*k2&&k2<=2*k1)){
flag=1;
break;
}
}
if(!(a==b&&b==1||a==b*b||b==a*a)) flag=1;
if(flag) cout<<"No\n";
else cout<<"Yes\n";
}
return 0;
}