题目解析
本题就是一道双重素数筛的题目,在挑战程序设计上也有介绍,但是本题我忽略了1不是素数,wa了一发。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
const int maxn = 1e5+100;
bool prime1[maxn], prime2[maxn];
int solve(LL a, LL b){
memset(prime1, 0, sizeof(prime1));
memset(prime2, 0, sizeof(prime2));
for(int i = 2; (LL)i*i <= b; i++){
if(!prime2[i]){
for(int j = 2*i; (LL)j*j <= b; j += i)
prime2[j] = true;
for(LL j = 2*i > ((a+i-1)/i)*i ? 2*i:((a+i-1)/i)*i; j <= b; j += i){
prime1[j-a] = true;
}
}
}
int ans = 0;
for(int i = 0; i <= b-a; i++) if(!prime1[i]) ans++;
if(a == 1) ans--;
return ans;
}
int main(){
int T;
scanf("%d", &T);
for(int kase = 1; kase <= T; kase++){
LL a, b;
scanf("%lld%lld", &a, &b);
printf("Case %d: %d\n", kase, solve(a, b));
}
return 0;
}