素数
欧拉筛法保证每个合数只会被其最小的素数筛掉,所以复杂度是线性的。
我们还能用此方法,筛出其他一些积性函数的值。
积性函数:若,则.
int p[N],n,cnt; bool b[N]; inline void prime(){ b[0]=b[1]=true; for(int i=2;i<=n;++i){ if(!b[i]) p[++cnt]=i; for(int j=1;j<=cnt&&i*p[j]<=n;++j){ b[i*p[j]]=true; if(!(i%p[j])) break; } } }
每次时跳出循环能保证每个合数只会被其最小的素数筛掉,因为的最小素数为。
欧拉函数
欧拉函数的定义:小于等于的正整数中与互质的数的个数。
证明:
- 如果为某一素数,则.
- 如果为某一素数的幂次,.
- 欧拉函数是积性函数,即当时.
- 若,
则.
设为最小的质数,,在线性筛中,被筛掉。
当时,;
当时,。
int p[N],phi[N],n,cnt; bool b[N]; inline void prime(){ b[0]=b[1]=true;phi[1]=1; for(int i=2;i<=n;++i){ if(!b[i]){ p[++cnt]=i;phi[i]=i-1; } for(int j=1;j<=cnt&&i*p[j]<=n;++j){ b[i*p[j]]=true; if(!(i%p[j])){ phi[i*p[j]]=p[j]*phi[i];break; } phi[i*p[j]]=(p[j]-1)*phi[i]; } } }
莫比乌斯函数
莫比乌斯函数的定义:
显然当是质数时,;
当不是质数时,设为最小的质数,,在线性筛中,被筛掉。
当时,当时,显然,;
当时,,即;
当时,显然,。
int p[N],mu[N],n,cnt; bool b[N]; inline void prime(){ b[0]=b[1]=true;mu[1]=1; for(int i=2;i<=n;++i){ if(!b[i]){ p[++cnt]=i;mu[i]=-1; } for(int j=1;j<=cnt&&i*p[j]<=n;++j){ b[i*p[j]]=true; if(!(i%p[j])){ mu[i*p[j]]=0;break; } mu[i*p[j]]=-mu[i]; } } }