题目
题解
欧拉筛+分解质因子。
通过欧拉筛将全部素数筛出来,对输入的数进行分解质因子,统计质因子个数,若等于2输出yes,其他输出no。
更新于2022.4.3
完全没必要分解质因数,直接统计完全部的素数后,遍历素数,如果n能整除该素数且商也是个素数则说明n为目标,如果不存在这种情况说明n不满足。
后一个代码实现的这个思路。
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int vis[N], prime[N], cnt;
int n, x;
int main()
{
for(int i = 2;i < N;i ++) {
if(!vis[i]) prime[++cnt] = i;
for(int j = 1;j <= cnt;j ++) {
if(i*prime[j] >= N) break;
vis[i*prime[j]] = 1;
if(i%prime[j] == 0) break;
}
}
cin>>n;
while(n--) {
cin>>x;
int res = 0, flag = 0;
for(int i = 1;i <= cnt && prime[i] <= x;i ++) {
while(x%prime[i] == 0) {
res++, x/=prime[i];
if(res > 2) {flag = 1; break;}
}
if(flag) break;
}
if(res!=2) puts("No");
else puts("Yes");
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int T, n;
int vis[N], prime[N], cnt;
int main()
{
vis[1] = 1;
for (int i = 2;i < N-10;i ++) {
if (!vis[i]) prime[cnt ++] = i;
for (int j = 0;j < cnt;j ++) {
if (i * prime[j] >= N-10) break;
vis[i*prime[j]] = 1;
if (i % prime[j] == 0) break;
}
}
cin >> T;
while (T --) {
cin >> n;
int flag = 0;
for (int i = 0;prime[i] <= n;i ++)
if (n % prime[i] == 0 && !vis[n / prime[i]]) {
flag = 1;
break;
}
if (flag) puts ("Yes");
else puts ("No");
}
return 0;
}