Euler functions: linear sieve (template)

Shock! OIer actually use a \ (O (n ^ 2) \) Sieve up to 1 year!
The original screen and the screen is Euler function similar prime number, Eppendorf a sieve, a sieve ... linear

To achieve a linear screen, you must first clear the nature of the Euler function:
set \ (p \) is a prime number, then there

  • \(\varphi(p) = p-1\)
  • \ (If p i and prime, then \ varphi (i * p) = \ varphi (i) * (p-1) \)
  • \ (I and if p is not prime, then \ varphi (i * p) = \ varphi (i) * p \)

code show as below:

void get_phi(long long n) {
    p[1] = 1;
    for(long long i = 2; i <= n; i++) {
        if(!flag[i]) {
            prime[++cnt] = i;
            p[i] = i-1;
        }
        for(long long j = 1; j <= cnt && i*prime[j] <= n; j++) {
            flag[i*prime[j]] = true;
            if(i%prime[j])
                p[i*prime[j]] = p[i]*(prime[j]-1);
            else {
                p[i*prime[j]] = p[i]*prime[j];
                break;
            }
        }
    }
}

Guess you like

Origin www.cnblogs.com/mogeko/p/12508006.html