zoukankan      html  css  js  c++  java
  • 数论--欧拉函数

    欧拉函数

    计算与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/欧拉函数

  • 相关阅读:
    NYOJ47 过河问题
    CodeForces1165
    LuoGuP3667
    ZROI#958
    ZROI#957
    KMP小结
    LuoGuP2742[模板]二维凸包
    ZROI#999
    ZROI#997
    ZROI#996
  • 原文地址:https://www.cnblogs.com/hezongdnf/p/12081004.html
Copyright © 2011-2022 走看看