Eular 函数模板

  欧拉函数:用来求1...n-1范围内与n互质的数的个数

  phi(n) = n*(1 - 1/p1)*(1 - 1/p2)*...*(1 - 1/pk) (p1, p2, ... pk为n的质因子)

  因为 n = p1q1 * p2q2 * ... * pkqk

  带入得:phi(n) = (p1 - 1)*p1q1-1 * (p2 - 1)*p2q2-1 * ... * (pk - 1)*pkqk-1;

       代码: 

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

     

  欧拉函数打表: 

int Eu[N];

void init() {
    int i, j;
    for(i = 1; i < N; ++i)  Eu[i] = i;
    for(i = 2; i < N; ++i) {
        if(Eu[i] == i) {
            for(j = i; j < N; j += i) {
                Eu[j] = Eu[j]/i*(i - 1);
            }
        }
    }
}

   

   

原文地址:https://www.cnblogs.com/vongang/p/2873788.html