1. 题目来源
前置知识:
2. 题目解析
挺有意思的一个题目哈,思路转换到后面就是找到 [l, r]
区间内部的所有质数平方的个数。
思路:
- 预处理质数。
- 判断每个质数的平方是否在
[l, r]
区间内即可。- 这里应该用
f[0, r] - f[0, l - 1]
的方式直接 O(1) 得到[l, r]
区间内质数的个数。这是区间问题一贯的转换方式。
- 这里应该用
坑点:
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)
const int N = 1e5 + 50;
int prime[N], c = 0;
bool st[N];
bool inited = false;
// 线性筛
void init_prime(int n) {
if (inited) return ; // lc 多样例执行的模式,需要这个标记,不然重复初始化
inited = true;
for (int i = 2; i <= n; i++) {
if (!st[i]) prime[c++] = i;
for (int j = 0; prime[j] <= n / i; j++) {
st[prime[j] * i] = true;
if (i % prime[j] == 0)
break;
}
}
}
// 埃式筛:
void init_prime(int n) {
if (inited) return ; // lc 多样例执行的模式,需要这个标记,不然重复初始化
inited = true;
for (int i = 2; i <= n; i++) {
if (!st[i]) {
prime[c ++ ] = i;
for (int j = i + i; j <= n; j += i) st[j] = true;
}
}
}
class Solution {
public:
int nonSpecialCount(int l, int r) {
init_prime(1e5);
int res = 0;
typedef long long LL;
for (int pr : prime) {
LL x = 1ll * pr * pr;
if (x >= l && x <= r) {
res ++ ;
}
}
return r - l + 1 - res;
}
};