题目大意:判断给定数组中是否存在一对数不互质。
题目分析:
我们可以利用筛质数,将题目数据范围内所用到的质数都筛出来, 对每一个数进行分解质因数存入map中,如果某个质数出现次数大于1,那么就一定存在不互质的一对数。
代码:
#include<iostream>
#include<map>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 2e6+10;
int prime[N], a[N];
bool st[N];
int cnt;
map<int,int> mp;
signed main(){
int t;
cin >> t;
int m = N;
for(int i = 2;i <= m; i ++)
{
if(!st[i]) prime[cnt++] = i;
for(int j = 0; prime[j] <= m / i; j++)
{
st[prime[j] * i] = true;
if(i % prime[j] == 0) break;
}
}
while(t--)
{
mp.clear();
int n;
cin>>n;
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
bool is = false;
for(int i = 1; i <= n; i++) {
int u = a[i];
for(int j = 0; prime[j] * prime[j] <= u; j++) {
int v = prime[j];
if(u % v == 0)
{
while(u % v == 0) u /= v;
mp[v]++;
if(mp[v]>1)
{
is = true;
break;
}
}
}
if(u > 1){
mp[u]++;
if(mp[u] > 1){
is = true;
break;
}
}
if(is) break;
}
if(is) puts("YES");
else puts("NO");
}
return 0;
}