[线筛五连]线筛欧拉函数

伪模板链接:https://www.luogu.org/problemnew/show/P1390

线筛欧拉函数

欧拉函数定义

在数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目( φ(1)=1 φ ( 1 ) = 1

写成式子如下:

φ(x)=i=1x[gcd(i,n)=1] φ ( x ) = ∑ i = 1 x [ g c d ( i , n ) = 1 ]

欧拉函数性质

计算欧拉函数的值时,有公式如下:

φ(x)=xp|x(11p) φ ( x ) = x ∏ p | x ( 1 − 1 p )

那么显然,对于互质的两个数 x,y x , y ,其质因数的集合完全不相同,就有:

φ(xy)=[xyp|xy(11p)] φ ( x y ) = [ x y ∏ p | x y ( 1 − 1 p ) ]

φ(xy)=[xp1|x(11p1)]×[yp2|x(11p2)] φ ( x y ) = [ x ∏ p 1 | x ( 1 − 1 p 1 ) ] × [ y ∏ p 2 | x ( 1 − 1 p 2 ) ]

φ(xy)=φ(x)×φ(y) φ ( x y ) = φ ( x ) × φ ( y )

所以,欧拉函数是积性的。

另外,欧拉函数还可以由莫比乌斯函数推导,具体的将在莫比乌斯反演总结中叙述。

欧拉函数的线筛

T=i×p[j] T = i × p [ j ]

1.当 T T 为素数时,显然,与T互质的数有 T1 T − 1 个;

2.当 T T 拥有多个最小质因子(即i mod p[j]=0)时,根据上面最初的公式, i i T的质因子集合是一样的,所以区别就在于前面的系数,故 φ(T)=φ(i)×p[j] φ ( T ) = φ ( i ) × p [ j ]

3.当 T T 的最小质因子仅有一个(即i mod p[j]0)时,显然 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 )

讨论完毕,得到线筛方程:

φ(T)=T1φ(i)×p[j]φ(i)×(p[j]1)TPrimei mod p[j]=0i mod p[j]0 φ ( T ) = { T − 1 T ∈ P r i m e φ ( i ) × p [ j ] i   m o d   p [ j ] = 0 φ ( i ) × ( p [ j ] − 1 ) i   m o d   p [ j ] ≠ 0

代码
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];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShadyPi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值