前置知识
线性筛
线性筛可以在严格$O(n)$的时间内筛出积性函数的值,
它有常见的套路
假设$n = p_1^{a_1} p_2^{a_2} \dots p_k^{a_k}$
如果我们能快速得出$f(p_i)$和$f(p_i^{k+1})$的取值,那么直接套板子就行了
在下文中如无特殊说明,默认$p_i$表示$n$质因数分解之后第$i$个质数,$a_i$表示$p_i$的指数
常见的有以下几种
线性筛素数
比较简单,这也是筛其他积性函数的基础
#include<cstdio> const int MAXN = 1e4 + 10; int N, prime[MAXN], vis[MAXN], tot; void GetPrime(int N) { vis[1] = 1; for(int i = 2; i <= N; i++) { if(!vis[i]) prime[++tot] = i; for(int j = 1; j <= tot && i * prime[j] <= N; j++) { vis[i * prime[j]] = 1; if(!(i % prime[j])) break; } } } int main() { GetPrime(1e3); for(int i = 1; i <= tot; i++) printf("%d ", prime[i]); return 0; }