zoukankan      html  css  js  c++  java
  • 欧拉线性筛

    欧拉线性筛

    原理:

    把每个合数只用被最小质数因子筛掉。

    代码步骤:

    数组:

    bool isprime [maxn] //i是否为质数

    int primes[maxn],cnt=0; //存质数和质数个数

    步骤:

    ·将所有除0、1数字当成质数。

    ·i从2 to maxn开始循环:

    如果i是质数:加入到primes数组中

    j从1 to i*primes[j]<maxn开始循环:

    ​ 筛掉i*primes[j];

    如果i是primes[j]的整数倍=>break

    Code

    void Euler(){
    	memset(isprime,1,sizeof(isprime));
    	isprime[0]=isprime[1]=1;
    	for(int i=2;i<maxn;i++){
    		if(isprime[i]) primes[++cnt]=i;
    		for(int j=1;i*primes[j]<maxn;j++){
    			isprime[i*primes[j]]=0;
    			if(i%primes[j]==0) break;
    		}
    	}
    }
    

    其他:求l到r中的质数个数

    引入前缀数组num[maxn],表示1~i中的质数个数。

    Euler函数预处理后,i从1 to maxn循环,num[i]=isprime[i]?num[i-1]:num[i-1]+1;

    输出时输出num[r]-num[l-1];

    Code

    	Euler();
    	for(int i=1;i<=maxn;i++){
    		num[i]=num[i-1];
    		if(isprime[i]) num[i]++;
    	}
    
    int a,b;
    	while(~scanf("%d%d",&a,&b)) printf("%d
    ",num[b]-num[a-1]);
    
  • 相关阅读:
    阅读
    做人做事、原则
    20150913HTML5心得
    动画-七夕言情
    20150818 句子
    网站链接备份
    javascript设计模式2
    javascript设计模式1
    sunlime操作
    node系列4
  • 原文地址:https://www.cnblogs.com/saitoasuka/p/10330935.html
Copyright © 2011-2022 走看看