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

欧拉函数表示小于等于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

O(n)打欧拉函数表和素数表


#define N 100005
bool check[N];
int phi[N],prime[N],tot;
void eular()
{
    memset(check,0,sizeof(check));
    phi[1]=1;
    tot=0;
    for(int i=2;iN)break;
            check[i*prime[j]]=1;
            if(i%prime[j]==0)
            {
                phi[i*prime[j]]=phi[i]*prime[j];
                break;
            }
            else
            {
                phi[i*prime[j]]=phi[i]*(prime[j]-1);
            }
        }
    }
}

 

你可能感兴趣的:(数学,数论)