欧拉函数

来自三三百科
跳转到导航 跳转到搜索

求单个欧拉函数

int phi(int n)
{
    int ans = n;
    for (int i = 2; 1LL * i * i <= 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);
    return ans;
}

线性筛求欧拉函数

const int MAXN = 40000;
bool p[MAXN + 5];
int phi[MAXN + 5];
vector<int> pri;
// 筛出 1~n 中的每个数是否为质数
// 顺带求出所有欧拉函数
void get_primes(int n)
{
    for (int i = 1; i <= n; i++)
        p[i] = true;
    p[0] = p[1] = false;
    phi[1] = 1;
    for (int i = 2; i <= n; i++)
    {
        if (p[i])
        {
            pri.push_back(i);
            phi[i] = i - 1;
        }
        for (int j = 0; j < pri.size(); j++)
        {
            // i*pri[j]
            if (1LL * i * pri[j] > n)
                break;
            p[i * pri[j]] = false;
            if (i % pri[j] == 0)
            {
                phi[i * pri[j]] = phi[i] * pri[j];
                break;
            }
            else
                phi[i * pri[j]] = phi[i] * (pri[j] - 1);
        }
    }
}