逆元求lcm,双模哈希,记录
#include <iostream>
#include <cstdio>
#define int long long
const int MOD1=1145141;
const int MOD2=948187;
int Power1(int x,int y) {
int ans=1;
int base=x%MOD1;
while(y) {
if(y&1) ans=ans*base%MOD1;
base=base*base%MOD1;
y>>=1;
}return ans;
}
int Power2(int x,int y) {
int ans=1;
int base=x%MOD2;
while(y) {
if(y&1) ans=ans*base%MOD2;
base=base*base%MOD2;
y>>=1;
}return ans;
}
int gcd1(int x,int y){return x%y?gcd1(y,x%y)%MOD1:y%MOD1;}
int gcd2(int x,int y){return x%y?gcd2(y,x%y)%MOD2:y%MOD2;}
int lcm1(int x,int y){return x*Power1(gcd1(x,y),MOD1-2)%MOD1*y%MOD1;}
int lcm2(int x,int y){return x*Power2(gcd2(x,y),MOD2-2)%MOD2*y%MOD2;}
int T;
signed main() {
for(scanf("%lld",&T);T--;) {
int n,a[500005];
scanf("%lld",&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
int gcdsum1=gcd1(a[1],a[2]);
int gcdsum2=gcd2(a[1],a[2]);
int lcmsum1=lcm1(a[1],a[2]);
int lcmsum2=lcm2(a[1],a[2]);
int times1=1,times2=1;
for(int i=1;i<=n;i++) times1=times1*a[i]%MOD1;
for(int i=1;i<=n;i++) times2=times2*a[i]%MOD2;
for(int i=3;i<=n;i++) gcdsum1=gcd1(gcdsum1,a[i])%MOD1;
for(int i=3;i<=n;i++) gcdsum2=gcd2(gcdsum2,a[i])%MOD2;
for(int i=3;i<=n;i++) lcmsum1=lcm1(lcmsum1,a[i])%MOD1;
for(int i=3;i<=n;i++) lcmsum2=lcm2(lcmsum2,a[i])%MOD2;
if(gcdsum1*lcmsum1%MOD1==times1&&gcdsum2*lcmsum2%MOD2==times2) puts("Yes");
else puts("No");
}
return 0;
}