浅谈欧拉函数 By cellur925

1.某神犇Blog 学了三遍的 欧拉函数φ--DEADFISH7

2.我要做一些补充o(* ̄▽ ̄*)o

  $φ(1)=1$;

  公式有两种形式,一种有太多除法,实际可能会慢些。通用

  对于任意$n$>1,1~$n$中与$n$互质的数之和等于$n*φ(n)/2$。

  是积性函数。

  $sigma(d|n) φ(d)=n$。

代码实现

1°:朴素的质因数分解顺便求出

void init_phi()
{
    int ans=n;
    for(int i=2;i<=sqrt(n);i++)
    {
        if(n%i==0)
        {
            ans=ans/i*(i-1);
            while(n%i==0) n/=i;
        }
        if(n>1) ans=ans/n*(n-1);
    }
}

适用于单个查询的情况,但是效率有点低,$O(sqrt(n))$,嘤。

2°:线性筛素数,顺便把欧拉函数也整出来。(适用于递推,连续1~n)

在线性筛板子上稍加修改即可,复杂度$O(n)$。

void init_phi()
{
    phi[1]=1;
    for(int i=2;i<=lim;i++)
    {
        if(v[i]==0)
        {
            prime[++m]=i;
            v[i]=i;
            phi[i]=i-1;
        }
        for(int j=1;j<=m;j++)
        {
            if(prime[j]>v[i]||prime[j]>lim/i) break;
            v[i*prime[j]]=prime[j];
            phi[i*prime[j]]=phi[i]*(i%prime[j] ? prime[j]-1 :prime[j]);
        }
    }
}

例题 仪仗队

posted @ 2018-10-08 23:21  cellur925&Chemist  阅读(251)  评论(0编辑  收藏  举报