个人认为分解质因数没有错误,讨论版的hack都过了
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+10;
int T,n,a[N];
#define LOCAL
namespace ly
{
namespace IO
{
#ifndef LOCAL
#define SIZE (1<<20)
char in[SIZE],out[SIZE],*p1=in,*p2=in,*p3=out;
#define getchar() (p1==p2&&(p2=(p1=in)+fread(in,1,SIZE,stdin),p1==p2)?EOF:*p1++)
#define flush() (fwrite(p3=out,1,SIZE,stdout))
#define putchar(ch) (p3==out+SIZE&&flush(),*p3++=(ch))
class Flush{public:~Flush(){flush();}}_;
#endif
template<typename type>
inline void read(type &x)
{
x=0;bool flag(0);char ch=getchar();
while(!isdigit(ch)) flag^=ch=='-',ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
flag?x=-x:0;
}
template<typename type>
inline void write(type x,bool flag=1)
{
x<0?x=-x,putchar('-'):0;static short Stack[50],top(0);
do Stack[++top]=x%10,x/=10;while(x);
while(top) putchar(Stack[top--]|48);
flag?putchar('\n'):putchar(' ');
}
#ifndef LOCAL
#undef SIZE
#undef getchar
#undef putchar
#undef flush
#endif
}
}using namespace ly::IO;
//快读模版,不用多管
int prime[6000000],cnt=0;
int isprime[100001000];
bool vis[6000000];
void __init__(){
memset(isprime,-1,sizeof(isprime));
isprime[1] = false;
for(int i=2;i<=1e8;++i){
if(isprime[i]){
prime[++cnt]=i;
isprime[i]=cnt;
}
for(int j = 1;j<=cnt&&i*prime[j]<=1e8;++j){
isprime[i*prime[j]]=false;
if(i%prime[j]==0) break;
}
}
return ;
}
bool factor(int x){
// printf("It comes to %d\n",x);
if(isprime[x]){
// printf("%d is a prime number\n",x);
vis[isprime[x]]=true;
return false;
}
for(int j=1;prime[j]*prime[j]<=x;j++){
if(x%prime[j]) continue;
// printf("%d can be divided by %d with no remainder\n",x,prime[j]);
if(vis[j]){
return true;
}
while(!(x%prime[j])){
x/=prime[j];
}
vis[j]=true;
}
if(x==1) return false;
if(vis[isprime[x]]) return true;
vis[isprime[x]] = true;
return false;
}
int main(){
read(T);
__init__();
// for(int i=1;i<=10000100;i++){
// printf("%d is %s prime;\n",i,(isprime[i]?"":"not"));
// }
while(T--){
read(n);
int gcd;
memset(vis,0,sizeof vis);
for(int i=1;i<=n;i++){
read(a[i]);
gcd=(i==1?a[i]:__gcd(a[i],gcd));
// printf("Now gcd is %d\n",gcd);
}
if(n==2){
printf("Yes");
goto CON;//飞过去只为换个行
}
if(gcd!=1){
printf("No");
goto CON;//飞过去只为换个行
}
for(int i=1;i<=n;i++){
if(factor(a[i])){
printf("No");
goto CON;//飞过去只为换个行
}
}
printf("Yes");
CON:
puts("");
}
}