素数
欧拉筛法保证每个合数只会被其最小的素数筛掉,所以复杂度是线性的。
我们还能用此方法,筛出其他一些积性函数的值。
积性函数:若,则
.
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]; } } }