题意
比较明显了, 细节题, 惨
code
#include<iostream>
#include<cstring>
using namespace std;
const int N = 1000005;
const int M = 1 << 20;
int sum[N << 2], ans[N << 2], s, a;
bool f[N];
void init(){
memset(f, 0, sizeof f);
memset(sum, 0, sizeof sum);
memset(ans, 0, sizeof ans);
for(int i = 2; i < 1000000; ++i)
if(!f[i]){
sum[i + M] = 1;
if(i % 4 == 1 || i == 2) ans[i + M] = 1;/*特例2*/
for(int j = i + i; j < 1000000; j += i) f[j] = 1;
}
/** for(int i = 10; i <= 20; ++i) if(sum[i + M]) cout << i << endl;*/
for(int i = M - 1; i; --i){
sum[i] = sum[i << 1] + sum[i << 1 | 1];
ans[i] = ans[i << 1] + ans[i << 1 | 1];
}
}
void query(int l, int r){
l += M - 1;
r += M + 1;
while(r ^ l ^ 1){
if(~l & 1){
s += sum[l + 1];
a += ans[l + 1];
}
if(r & 1){
s += sum[r - 1];
a += ans[r - 1];
}
l >>= 1;
r >>= 1;
}
}
int main(){
init();
int l, r;
while(cin >> l >> r){
if(l == -1 && r == -1) break;
int ll = l, rr = r;/*记下l, r*/
s = a = 0;
if(r >= 2){/*处理*/
if(l <= 0) l = 1;
query(l, r);
}
cout << ll << " " << rr << " " << s << " " << a << endl;
}
return 0;
}