HDU 3972

来源:互联网 发布:古村之友 知乎 编辑:程序博客网 时间:2024/05/21 06:32

求N以前孪生素数个数。
预处理素数表,10W以内大约1W个素数。
讲道理,暴力不太稳妥,于是写了个树状数组。
可是似乎暴力也能过。。。。

#include <cstdio>#include <cstring>#include <cstdio>#include <iostream>using namespace std;const int MAXN=100001;bool prime[MAXN];int a[MAXN];int sum[MAXN];void init(){    memset(prime,false,sizeof(prime));    prime[0]=prime[1]=true;    for(int i=2;i<MAXN;i++) if(!prime[i]){        if(i>MAXN/i)continue;        for(int j=i*i;j<MAXN;j+=i) prime[j]=true;    }} int lowbit(int x){    return x&(-x);}void add(int k,int delta){    while(k<=MAXN){        sum[k]+=delta;        k+=lowbit(k);    }}int query(int k){    int s = 0;    while(k){        s+=sum[k];        k-=lowbit(k);    }    return s;}int main(){    init();    for(int i=5;i<=MAXN;i++)        if(prime[i]==0&&prime[i-2]==0){            add(i,1);        }    int n;    while(cin>>n,n>=0){        printf("%d\n",query(n));    }    return 0;} 
0 0
原创粉丝点击