质数筛
const int MAXN = 1e7;int p[MAXN], ptop;void sieve(int n) { for(int i = 2; i <= n; i++) { if(!p[i]) p[++ptop] = i; for(int j = 1, t; j <= ptop && (t = i * p[j]) <= n; j++) { p[t] = 1; if(i % p[j]) ; else break; } }}
欧拉函数筛
其实判断!phi[i]就足够了,不过这样写统一一些。
const int MAXN = 1e7;int phi[MAXN];int p[MAXN], ptop;void sieve(int n) { phi[1] = 1; for(int i = 2; i <= n; ++i) { if(!p[i]) p[++ptop] = i, phi[i] = i - 1; for(int j = 1, t; j <= ptop && (t = i * p[j]) <= n; ++j) { p[t] = 1; if(i % p[j]) phi[t] = phi[i] * (p[j] - 1); else { phi[t] = phi[i] * p[j]; break; } } }}
莫比乌斯函数筛
const int MAXN = 1e7;int mu[MAXN];int p[MAXN], ptop;void sieve(int n) { mu[1] = 1; for(int i = 2; i <= n; i++) { if(!p[i]) p[++ptop] = i, mu[i] = - 1; for(int j = 1, t; j <= ptop && (t = i * p[j]) <= n; j++) { p[t] = 1; if(i % p[j]) mu[t] = -mu[i]; else { mu[t] = 0; break; } } }}