思路

看了别人的题解才恍然大悟啊……赢的人乘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;
}