欧拉筛
欧拉筛
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); } } }