赞
踩
给你一个数字x, 判断其约数个数是否为3.
假设x != 1, 那么1和数字x本身一定都是其约数, 此时我们还差一个约数. 且这个约数一定得是一个质数.
考虑到约数本身的性质, 如果a是x的一个约数, 则 b=x/a 也一定是x的一个约数. 因为我们此时只差一个约数, 因此应有a = b
. 到这里, 这个题就很明确了, 这个数字x是一个质数的平方. 只有这样, 我们才能保证他只有3个约数.
#include <bits/stdc++.h> #define rep(i, n) for (int i = 1; i <= (n); ++i) using namespace std; typedef long long ll; const int N = 1E6 + 10; bool vis[N]; int prime[N], ind; void init(int n = N - 5) { vis[1] = 1; for (int i = 2; i <= n; ++i) { if (!vis[i]) prime[++ind] = i; for (int j = 1; prime[j] <= n / i; ++j) { vis[i * prime[j]] = 1; if (i % prime[j] == 0) break; } } } bool fact(ll x) { int y = sqrt(x); return 1ll * y * y == x and !vis[y]; } int main() { init(); int n; cin >> n; rep(i, n) { ll x; scanf("%lld", &x); printf("%s\n", fact(x) ? "YES" : "NO"); } return 0; }
QAQ 一开始暴力判断了, 结果T了, 仔细一想, 发现不太对劲.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。