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;
}