数论学习之欧拉函数(直接求,打表)

欧拉函数表示小于等于n且与n互质的数的数量

直接求,用到了容斥定理:先求一个数的质因数分解

int phi(int x)
{
    int ans=x;
    for(int i=2;i*i<=x;i++)
    {
        if(x%i==0)
        {
            ans=ans/i*(i-1);
            while(x%i==0)
            {
                x/=i;
            }
        }
    }
    if(x>1)
    {
        ans=ans/x*(x-1);
    }
    return ans;
}

打表法:类似于线性筛法。。

int phi[N],prime[N];
int tot=0;
void euler()
{
    phi[1]=1;
    for(int i=2;i<N;i++)
    {
        if(!phi[i])//如果p为质数,phi[p]=p-1;
        {
            phi[i]=i-1;
            prime[tot++]=i;
        }
        for(int j=0;j<tot&&1ll*i*prime[j]<N;j++)
        {
            if(i%prime[j])//如果p为质数,i%p==0,phi[i*p]=phi[i]*p;
            {
                phi[i*prime[j]]=phi[i]*(prime[j]-1);
            }
            else//如果p为质数,i%p!=0,phi[i*p]=phi[i]*(p-1);
            {
                phi[i*prime[j]]=phi[i]*prime[j];
                break;
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/neuq_zsmj/article/details/80152410
今日推荐