素数数目
时间限制: 1 Sec 内存限制: 256 MB
提交: 60 解决: 13
[状态] [提交] [命题人:外部导入]
题目描述
给定区间[L,R],计算区间素数个数。
输入
输入两个整数L,R(1<=L<=R<=10^12,R-L<=1000000)
输出
输出一行表示区间素数的个数
样例输入 Copy
2 11
样例输出 Copy
5
题目来源:
http://oj.ecustacm.cn/problem.php?id=1087
思路参考:
https://blog.csdn.net/qq_32866009/article/details/76945320
#include <algorithm>
#include <iostream>
#include <vector>
typedef long long LL;
using namespace std;
const int MAXN = 1000007;
bool is_prime[MAXN];//大区间:统计l-r的素数数目(通过统计合数间接获取)
bool is_prime_small[MAXN];//小区间:2-sqrt(r)的素数
//区间筛法
int prime_num(LL l, LL r) {
if (l < 2)l = 2;
for (LL i = 0; i * i <= r; i++)is_prime_small[i] = true;
for (LL i = 0; i <= r - l; i++)is_prime[i] = true;
for (LL i = 2; i * i <= r; i++) {
if (is_prime_small[i]) {
for (LL j = 2 * i; j * j <= r; j += i) {//排除小区间的合数
is_prime_small[j] = false;
}
for (LL j = max(2LL, (l + i - 1) / i) * i; j <= r; j += i) {//(l+i-1)/i为[l,r)区间内的第一个数至少为i的多少倍.
is_prime[j - l] = false;
}
}
}
//统计
int ans = 0;
for (LL i = 0; i <= r - l; i++) if(is_prime[i]) ans++;
return ans;
}
int main() {
LL L, R;
cin >> L >> R;
cout << prime_num(L, R) << endl;
return 0;
}