还是没卡掉一种枚举只因数 nn 的做法
我还是很认同我的码风的,不写注释大家应该都能开得懂
//
// main.cpp
// T349349 [yLOI2022] 西施江南
//
// Created by SkyWave Sun on 2023/7/22.
//
#include <iostream>
#include <unordered_set>
#include <bitset>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
#define N (int)5e5 + 1
#define V (int)1e8 + 1
int primes[5761457];
bitset<V> mark;
void init() {
for (int i = 2; i * i <= V - 1; i += (i == 2 ? 1 : 2)) {
if (!mark[i]) {
for (int j = i * i; j <= V - 1; j += i) {
mark[j] = true;
}
}
}
}
void solve() {
int n;
scanf("%d", &n);
vector<int> vec(n);
for (int i = 0; i < n; ++i) {
scanf("%d", &vec[i]);
}
if (n == 2) {
puts("Yes");
return;
}
unordered_set<int> st;
int len = (int)vec.size();
for (int i = 0; i < len; ++i) {
int tmp = vec[i];
if (!mark[tmp]) {
if (st.count(tmp)) {
puts("No");
return;
}else {
st.insert(tmp);
}
}else {
for (int j = 1; primes[j] <= tmp; ++j) {
if (tmp % primes[j] == 0) {
if (st.count(primes[j])) {
puts("No");
return;
}
st.insert(primes[j]);
while (tmp % primes[j] == 0) {
tmp /= primes[j];
}
}
}
if (tmp != 1) {
if (st.count(tmp)) {
puts("No");
return;
}
st.insert(tmp);
}
}
}
puts("Yes");
}
int main(int argc, const char * argv[]) {
init();
int cnt = 0;
for (int i = 2; i <= V - 1; i += (i == 2 ? 1 : 2)) {
if (!mark[i]) {
primes[++cnt] = i;
}
}
int T;
scanf("%d", &T);
while (T--) {
solve();
}
return 0;
}