/* 线性筛求出莫比乌斯函数的值 利用积性函数的性质 */ mu[1] = 1; for(int i = 2; i <= n; ++i) { if(not_prime[i] == 0) { tot++; prime[tot] = i; mu[i] = -1; } for(int j = 1; prime[j] * i <= n; ++j) { not_prime[prime[j] * i] = 1; if(i % prime[j] == 0) { mu[prime[j] * i] = 0; break; } mu[prime[j] * i] = -mu[i]; } } /* 线性筛欧拉函数 */ void get_eular() { pnum = 0; for(int i = 2; i < MAX; i++) { if(!noprime[i]) { p[pnum ++] = i; phi[i] = i - 1; } for(int j = 0; j < pnum && i * p[j] < MAX; j++) { noprime[i * p[j]] = true; if(i % p[j] == 0) { phi[i * p[j]] = phi[i] * p[j]; break; } phi[i * p[j]] = phi[i] * (p[j] - 1); } } }
线性筛素数
int is_prime[N], prime[N]; void get_prime(int n) { for (int i = 1; i <= n; i++) is_prime[i] = true; is_prime[0] = is_prime[1] = false; int tot = 0; for (int i = 2; i <= n; i++) { if (is_prime[i]) prime[tot++] = i; for (int j = 0; j < tot && prime[j] * i <= n; j++) { is_prime[prime[j] * i] = false; if (i % prime[j] == 0) break; } } }