您的位置:首页 > 其它

Help Hanzo-LightOJ - 1197

2018-02-14 22:27 295 查看
题意:计算a,b区间内的素数个数
欧拉筛法加区间筛法
AC代码:
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>

using namespace std;
long long p[100005];
int vis3[100005];
int vis4[100005];

int main() {
int n;
while (cin >> n) {
int temp = 1;
while (n--) {
long long a, b;
cin >> a >> b;
long long l = sqrt(b + 0.5);
int cnt;
memset(vis3, 0, sizeof(vis3));
memset(vis4, 0, sizeof(vis4));
cnt = 0;
for (long long i = 2; i <= l; i++) {
if (!vis3[i]) p[cnt++] = i;
for (int j = 0; j < cnt && i * p[j] <= l; j++) {
vis3[i * p[j]] = 1;
if (i % p[j] == 0) break;
}
}
for (int k = 0; k < cnt; ++k) {
long long temp1 = max(a / p[k] - 1, p[k]);
for (long long i = p[k] * temp1; i <= b; i += p[k]) {
if (i >= a)
vis4[i - a] = 1;
}
}
int sum = 0;
if (a == 1)
vis4[0] = 1;//注意1不是质数
for (int m = 0; m <= b - a; ++m) {
if (vis4[m] == 0)
sum++;
}
printf("Case %d: %d\n", temp++, sum);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM 数论