查看: 915|回复: 0

[C/C++] P3912 素数个数

[复制链接]

1

技术

25

魅力

7

原创

管理员

Rank: 9Rank: 9Rank: 9

积分
11343
人气
297
分享
42

论坛元老优秀版主活跃会员最佳新人灌水之王

发表于 2021-8-16 16:36:00 | 显示全部楼层 |阅读模式
题目描述
求 1,2,⋯,N 中素数的个数。

输入格式
一行一个整数 N。

输出格式
一行一个整数,表示素数的个数。

输入输出样例
输入 #1
10
输出 #1
4

[C++] 纯文本查看 复制代码
#include <iostream>
#include <cstdio>
#include <vector>
#include <unordered_map>
#include <cmath>
using namespace std;

int countPrimes(int n) {
	if (n < 2) return 0;
	int r{ int(sqrt(1.0 * n)) };
	vector<int> V(r, n);
	for (int i = 0; i < r; i++) {
		V[i] /= (i + 1);
	}
	for (int d = V.back() - 1; d > 0; d--) {
		V.push_back(d);
	}
	unordered_map<int, int> S;
	for (auto v : V) {
		S[v] = v - 1;
	}
	for (int p = 2; p <= r; p++) {
		if (S[p] == S[p - 1]) continue;
		int p2{ p * p };
		int sp_1{ S[p - 1] };
		for (auto v : V) {
			if (v < p2) {
				break;
			}
			S[v] -= S[v / p] - sp_1;
		}
	}
	return S[n];
}

int main(){
    int n;
    cin >> n;
    cout << countPrimes(n);
    return 0;
}

Just do it.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表