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;
}
欧拉筛法加区间筛法
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;
}
相关文章推荐
- LightOJ - 1197 Help Hanzo 较大数的区间素数筛法
- lightOJ 1197 Help Hanzo 两阶段素数筛选
- Help Hanzo LightOJ - 1197
- LightOj 1197 - Help Hanzo(分段筛选法 求区间素数个数)
- LightOJ 1197 - Help Hanzo 【思维找素数 -> 区间素数筛选】
- Help Hanzo LightOJ - 1197
- LightOJ 1197 Help Hanzo 求区间内素数的个数
- LightOJ 1197 Help Hanzo 素数筛
- 数学-B Help Hanzo (LightOJ - 1197 )
- LightOJ - 1197 Help Hanzo 素数筛
- Help Hanzo lightof 1197 求一段区间内素数个数,[l,r] 在 [1,1e9] 范围内。r-l<=1e5; 采用和平常筛素数的方法。平移区间即可。
- LightOJ 1197 Help Hanzo(区间素数筛选)
- LightOJ 1197 区间素数筛(注意溢出的处理)
- 数论基础1009 LightOJ 1197
- [大区间素数] lightoj 1197
- LightOJ 1197 Help Hanzo(区间素数筛选)
- LightOJ1197【数学】
- lightoj1197区间素数筛
- LightOJ 1197 Help Hanzo(区间素数筛)
- Help Hanzo(区间求素数) LightOJ - 1197 板子题