欧拉筛

欧拉筛

bitset<maxn> is_prime;
int prime[maxn], prime_cnt;

void get_prime(int n) {
    is_prime[1] = 1;
    for(int i = 2; i <= n; i++) {
        if(is_prime[i] == 0) prime[++prime_cnt] = i;
        for(int j = 1; j <= prime_cnt && i * prime[j] <= n; j++) {
            is_prime[i * prime[j]] = 1;
            if(i % prime[j] == 0) break; 
        }
    }
}

单求欧拉函数

  欧拉函数的一些性质:

    1. φ(p) = p - 1(p是质数)

    2. φ(p * a) = (p - 1) * φ(a)(p是质数且p不能整除a)

    3. φ(p * a)=p * φ(a)(p是质数且p|a)

    4. 小于n的数中,与n互质的数的总和为:φ(n) * n / 2 (n > 1)。

    5. n = \(Σ_{d|n}\)φ(d), 即n的因数(包括1和它自己)的欧拉函数之和等于n。

    6. 若p为质数,n = \(p^k\),则 φ(n) = (p - 1) * \(p^{k-1}\)

    7. 欧拉函数是积性函数,但不是完全积性函数。若m,n互质,则 φ(m ∗ n) = φ(m) ∗ φ(n)。

 

void Euler() {  
    for(int i = 2; i < maxn; i++) {  
        if(!phi[i])  
        for(int j = i;j < maxn;j += i) {  
            if(!phi[j]) phi[j] = j;  
            phi[j] = phi[j]/i*(i-1);  
        }  
    }  
}

欧拉筛同时求欧拉函数

bitset<maxn> is_prime;

void get_phi()  
{  
    int k = 0;
    for(int i = 2; i < maxn; i++) {  
        if(is_prime[i] == 0) {  
            prime[k++] = i;  
            phi[i] = i-1;  
        }  
        for(int j = 0; j<k && i*prime[j]<maxn; j++) {  
            is_prime[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);  
        }  
    }  
}  

 

posted @ 2019-08-15 08:54  Ruby·Z  阅读(84)  评论(0编辑  收藏  举报