这是我的AC代码
#include <cstdio>
#include <cstring>
#include <set>
int T;
int n, a[500005];
inline int gcd(int x, int y){
if(y==0)
return x;
return gcd(y, x%y);
}
int main(){
//freopen("C2.in", "r", stdin);
//freopen("C2.out", "w", stdout);
scanf("%d", &T);
while(T--){
scanf("%d", &n);
for(int i=1;i<=n;i++)
scanf("%d", &a[i]);
if(n==2){
printf("Yes\n");
continue;
}
bool flag = false;
std::set< int > ds;
for(int i=1;i<=n;i++){
if(a[i] == 2 || a[i] == 3){
if(ds.find(a[i]) == ds.end())
ds.insert(a[i]);
else{
flag = true;
break;
}
}
for(int j=2;j*j<=a[i];j++){
if(a[i]%j == 0){
if(ds.find(j) == ds.end())
ds.insert(j);
else{
flag = true;
break;
}
while(a[i]%j == 0)
a[i] /= j;
}
}
if(flag)
break;
if(a[i]>3){
if(ds.find(a[i]) == ds.end()){
ds.insert(a[i]);
}else{
flag =true;
}
}
if(flag)
break;
}
if(flag)
printf("No\n");
else
printf("Yes\n");
}
return 0;
}
然而被我自己 hack 了……
1
3
12 3 5
正确输出
No
然而我把这个数据做对了(把倒数17行改一下,具体见这里)
求各位大佬帮忙