西施江南
题面中设
众所周知,
那么,怎么判断
首先,开一个 bool 数组,记录 bool 数组的第 No。
如果分解完 Yes。
可以提前筛一遍
最后注意,输出是 Yes 和 No,不是 YES 和 NO。比赛时差点在这里踩坑(这算坑吗?)。
赛时 AC 代码:
#include<bits/stdc++.h>
using namespace std;
//当 n=2 时输出 YES
//当 gcd=1 时判断是否两两互质,如果是输出 YES
int p[6000000];//存质数
bool x[100000001];//存是否不是质数
void s(){//筛质数
p[1]=2;
x[1]=0;//1 不是质数
int cnt=1;//筛出的质数个数
for(int i=2;i<100000000;i++){
if(!x[i]){//是质数
p[++cnt]=i;
}
for(int j=1;j<=cnt&&(long long)(i)*p[j]<=100000000;j++){
x[i*p[j]]=1;//x[i*p[j]] 不是质数
if(i%p[j]==0){
break;
}
}
}
}
int main(){
s();
ios::sync_with_stdio(false);
int t;cin>>t;
while(t--){
int n;cin>>n;
int a[n];
cin>>a[0];
int gcd=a[0];
for(int i=1;i<n;i++){
cin>>a[i];
gcd=__gcd(gcd,a[i]);
}//求这 n 个数的 gcd
if(n==2)cout<<"Yes"<<endl;//e 和 s 是小写
else if(gcd==1){
//判断 n 个数是否两两互质
bool b[100000000];//记录每个质因数是否出现过
for(int i=0;i<100000000;i++)b[i]=0;
bool f=1;//目前是否两两互质
for(int i=0;i<n;i++){
//分解 a[i] 的质因数
for(int j=1;p[j]*p[j]<=a[i];j++){
if(a[i]%p[j]==0){
if(b[p[j]]==1){//这个质数之前出现过了
f=0;//并非两两互质
break;
}
while(a[i]%p[j]==0){
a[i]/=p[j];
}
b[p[j]]=1;//p[j] 这个质数出现过了
}
}
if(a[i]!=1){
if(b[a[i]]==1){
f=0;
}else{
b[a[i]]=1;
}
}
//判断到目前为止是否全部互质
if(f==0){
cout<<"No"<<endl;//o 是小写
break;
}
//接下来判断下一个数
}
if(f){//n 个数两两互质
cout<<"Yes"<<endl;//e 和 s 是小写
}
}else{
cout<<"No"<<endl;//o 是小写
}
}
return 0;
}