HDU 3792 Twin Prime Conjecture

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;

}

 

你可能感兴趣的:(Prim)