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;
}
}
}
}