欧拉线性筛
原理:
把每个合数只用被最小质数因子筛掉。
代码步骤:
数组:
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]);