数论--欧拉函数

欧拉函数

计算与n互质的正整数个数

线性求eular

bool prime[maxn];    //素数
vector<int> v;
int f[maxn];        //欧拉函数

void euler(int n)
{
    mem(prime,1);
    for(int i = 2; i < n; i++)
    {
        if(prime[i]) v.push_back(i),f[i] = i-1;
        for(auto j : v)
        {
            if(i*j >= n) break;
            prime[i*j] = 0;
            if(i%j)         //根据当前素数(j)是否为i的素因子,分情况计算欧拉函数
                f[i*j] = f[i]*(j-1);
            else        //i是j的倍数
            {
                f[i*j] = f[i]*j;
                break;
            }
        }
    }
}

直接求euler

int euler(int n)
{
    int ret = 1, i;
    for (i = 2; i * i <= n; i++)
    {
        if (n % i == 0)
        {
            n /= i;
            ret *= i - 1;
            while (n % i == 0)
            {
                n /= i;
                ret *= i;
            }
        }
    }
    if (n > 1)
        ret *= n - 1;
    return ret;
}

参考博客

https://baike.baidu.com/item/欧拉函数

posted @ 2019-12-22 20:47  hezongdnf  阅读(243)  评论(0编辑  收藏  举报