伪模板链接:https://www.luogu.org/problemnew/show/P1390
线筛欧拉函数
欧拉函数定义
在数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目( φ(1)=1 φ ( 1 ) = 1 )
写成式子如下:
欧拉函数性质
计算欧拉函数的值时,有公式如下:
那么显然,对于互质的两个数 x,y x , y ,其质因数的集合完全不相同,就有:
所以,欧拉函数是积性的。
另外,欧拉函数还可以由莫比乌斯函数推导,具体的将在莫比乌斯反演总结中叙述。
欧拉函数的线筛
设 T=i×p[j] T = i × p [ j ]
1.当 T T 为素数时,显然,与互质的数有 T−1 T − 1 个;
2.当 T T 拥有多个最小质因子(即)时,根据上面最初的公式, i i 与的质因子集合是一样的,所以区别就在于前面的系数,故 φ(T)=φ(i)×p[j] φ ( T ) = φ ( i ) × p [ j ] ;
3.当 T T 的最小质因子仅有一个(即)时,显然 gcd(i,p[j])=1 g c d ( i , p [ j ] ) = 1 ,由于欧拉函数为积性函数,所以有 φ(T)=φ(i)×φ(p[j])=φ(i)×(p[j]−1) φ ( T ) = φ ( i ) × φ ( p [ j ] ) = φ ( i ) × ( p [ j ] − 1 ) ;
讨论完毕,得到线筛方程:
代码
void get()
{
R i,j,t;
check[1]=phi[1]=1;
for(i=2;i<=N;++i)
{
if(!check[i])p[++p[0]]=i,phi[i]=i-1;
for(j=1;j<=p[0];++j)
{
t=i*p[j];if(t>N)break;
check[t]=1;
if(i%p[j]==0){phi[t]=phi[i]*p[j];break;}
phi[t]=phi[i]*(p[j]-1);
}
phi[i]+=phi[i-1];
}
}