http://acm.hdu.edu.cn/showproblem.php?pid=3792
n为负数,静态查询,用树状数组写,蛋疼可见一斑。打素数表的时候内层循环对i再加一个判断,是为了防止i*j因为溢出而恒真(引用自sx老祖)
View Code
#include <iostream> using namespace std ; const int MAX=100001; int prime[MAX],tree[MAX],num[MAX]; int lowbit(int i){ return i&(-i); } void update(int x,int val) { for(int i=x;i<MAX;i+=lowbit(i)) tree[i]+=val; } int Sum(int x) { int sum=0; for(int i=x;i>0;i-=lowbit(i)) sum+=tree[i]; return sum; } int main() { int cnt=0; for(int i=2;i<MAX;i++) if(!prime[i]) { num[cnt++]=i; for(int j=i;i<318&&j*i<MAX;j++) prime[i*j]=1; } for(int i=1;i<cnt;i++) if(num[i]-num[i-1]==2) update(num[i],1); int n; while(scanf("%d",&n),n>=0) { if(!n)puts("0"); else printf("%d\n",Sum(n)); } return 0; }