zoukankan      html  css  js  c++  java
  • 筛素数

    普通筛

    const int MAXN = 50000void Prime()    // 素数表p[i]=1为素数 
    {  
        int i, j;  
        for (i=0; i<MAXN; i++) prime[i] = 1;  
        prime[0] = prime[1] = 0;  
        for (i=2; i<MAXN; i++)  
        {  
            if (!prime[i]) continue;  
            for (j=i*2; j<MAXN; j+=i) prime[ j ] = 0; //将每个素数的倍数都删去(有重复)
        }  
    }  

    线性筛

    每个合数除1外最小的因数一定是素数,只利用这个素数筛没有重复

    int prim[50000],prime_n; 
    bool is_pr[500000]={1,1};
    void prime(){
        int m=500000;
        for(int i=2;i<m;i++){
            if(!is_pr[i])prim[prime_n++]=i;//没有筛掉的为素数
            for(int j=0;j<prime_n&&i*prim[j]<m;j++){
                is_pr[prim[j]*i]=1;//筛掉
                if(i%prim[j]==0)break;//后面的数最小因数一定小于等于prim[j]
            }
        }
    }

    例题POJ3292 Semi-prime H-numbers(线性筛素数变形)

    #include<cstdio>
    #define maxs 250010
    #define maxh 1000002
    bool not_H_prime[maxs],is_H_composite[maxs];
    int H_prime[maxs],se,x,ans[maxs],h;
    int main(){
        for(int i=1;i<=(maxh>>2);i++){//线性筛H素数 
            x=(i<<2)+1;
            if(!not_H_prime[i])H_prime[++se]=x;
            for(int j=1;j<=se&&H_prime[j]*x<maxh;j++){
                not_H_prime[(H_prime[j]*x)>>2]=1;//用最小素因子H_prime[j]筛掉H_prime[j]*x
                if(x%H_prime[j]==0&&(x/H_prime[j])%4==1)break;//之后的H_prime[j]*x最小素因子已经不是H_prime[j],退出
            }
        }
        for(int i=1;i<=se;i++){//求H-composite数 
            for(int j=1;j<=i&&H_prime[i]*H_prime[j]<maxh;j++){
                is_H_composite[(H_prime[i]*H_prime[j])>>2]=1;
            }
        }
        for(int i=1;i<maxs;i++){//预处理答案 
            ans[i]=ans[i-1]+is_H_composite[i];
        }
        while(~scanf("%d",&h)&&h){
            printf("%d %d
    ",h,ans[h>>2]);
        }
        return 0;
    }
  • 相关阅读:
    UVA 10462 Is There A Second Way Left?(次小生成树&Prim&Kruskal)题解
    POJ 1679 The Unique MST (次小生成树)题解
    POJ 2373 Dividing the Path (单调队列优化DP)题解
    BZOJ 2709 迷宫花园
    BZOJ 1270 雷涛的小猫
    BZOJ 2834 回家的路
    BZOJ 2506 calc
    BZOJ 3124 直径
    BZOJ 4416 阶乘字符串
    BZOJ 3930 选数
  • 原文地址:https://www.cnblogs.com/bennettz/p/6895994.html
Copyright © 2011-2022 走看看