列表

详情


100371. 统计不是特殊数字的数字数量

给你两个 正整数 lr。对于任何数字 xx 的所有正因数(除了 x 本身)被称为 x真因数

如果一个数字恰好仅有两个 真因数,则称该数字为 特殊数字。例如:

返回区间 [l, r] 不是 特殊数字 的数字数量。

 

示例 1:

输入: l = 5, r = 7

输出: 3

解释:

区间 [5, 7] 内不存在特殊数字。

示例 2:

输入: l = 4, r = 16

输出: 11

解释:

区间 [4, 16] 内的特殊数字为 4 和 9。

 

提示:

相似题目

计数质数

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int nonSpecialCount(int l, int r) { } };

python3 解法, 执行用时: 61 ms, 内存消耗: 17.8 MB, 提交时间: 2024-07-29 17:39:17

def tag_primes_eratosthenes(n):  # 返回一个长度n的数组p,如果i是质数则p[i]=1否则p[i]=0
    primes = [1] * n
    primes[0] = primes[1] = 0  # 0和1不是质数
    for i in range(2, int(n ** 0.5) + 1):
        if primes[i]:
            primes[i * i::i] = [0] * ((n - 1 - i * i) // i + 1)
    return primes

primes = tag_primes_eratosthenes(31623)
pi = list(accumulate(primes))

class Solution:
    def nonSpecialCount(self, l: int, r: int) -> int:
        return r - l + 1 - (pi[isqrt(r)] - pi[isqrt(l - 1)])

golang 解法, 执行用时: 0 ms, 内存消耗: 2.5 MB, 提交时间: 2024-07-29 17:38:56

const mx = 31622
var pi = [mx + 1]int{}

func init() {
	for i := 2; i <= mx; i++ {
		if pi[i] == 0 { // i 是质数
			pi[i] = pi[i-1] + 1
			for j := i * i; j <= mx; j += i {
				pi[j] = -1 // 标记 i 的倍数为合数
			}
		} else {
			pi[i] = pi[i-1]
		}
	}
}

func nonSpecialCount(l, r int) int {
	cntR := pi[int(math.Sqrt(float64(r)))]
	cntL := pi[int(math.Sqrt(float64(l-1)))]
	return r - l + 1 - (cntR - cntL)
}

java 解法, 执行用时: 14 ms, 内存消耗: 40.1 MB, 提交时间: 2024-07-29 17:38:28

class Solution {
    private static final int MX = 31622;
    private static final int[] PI = new int[MX + 1];

    static {
        for (int i = 2; i <= MX; i++) {
            if (PI[i] == 0) { // i 是质数
                PI[i] = PI[i - 1] + 1;
                for (int j = i * i; j <= MX; j += i) {
                    PI[j] = -1; // 标记 i 的倍数为合数
                }
            } else {
                PI[i] = PI[i - 1];
            }
        }
    }

    public int nonSpecialCount(int l, int r) {
        return r - l + 1 - (PI[(int) Math.sqrt(r)] - PI[(int) Math.sqrt(l - 1)]);
    }
}

cpp 解法, 执行用时: 3 ms, 内存消耗: 8.3 MB, 提交时间: 2024-07-29 17:37:38

const int MX = 31622;
int pi[MX + 1];

auto init = [] {
    for (int i = 2; i <= MX; i++) {
        if (pi[i] == 0) { // i 是质数
            pi[i] = pi[i - 1] + 1;
            for (int j = i * i; j <= MX; j += i) {
                pi[j] = -1; // 标记 i 的倍数为合数
            }
        } else {
            pi[i] = pi[i - 1];
        }
    }
    return 0;
}();

class Solution {
public:
    int nonSpecialCount(int l, int r) {
        return r - l + 1 - (pi[(int) sqrt(r)] - pi[(int) sqrt(l - 1)]);
    }
};

python3 解法, 执行用时: 49 ms, 内存消耗: 16.6 MB, 提交时间: 2024-07-29 17:37:20

'''
正难则反,统计区间 [l, r] 内有多少特殊数字
'''
MX = 31622  # sqrt(10**9)
pi = [0] * (MX + 1)
for i in range(2, MX + 1):
    if pi[i] == 0:  # i 是质数
        pi[i] = pi[i - 1] + 1
        for j in range(i * i, MX + 1, i):
            pi[j] = -1  # 标记 i 的倍数为合数
    else:
        pi[i] = pi[i - 1]

class Solution:
    def nonSpecialCount(self, l: int, r: int) -> int:
        return r - l + 1 - (pi[isqrt(r)] - pi[isqrt(l - 1)])

上一题