筛法
欧拉筛
模版
bool: vis 数组的含义是 若 vis[x] 为 true, 则 x 不是质数, 否则 x 是质数.
int: vis 数组的含义是 vis[x] 为 x 的一个质因子, vis[x] 与 x 相等时, x 是质数 (1除外).
积性函数的筛法
\[ f(n*p)=\begin{cases} f(n)*f(p)&p\nmid n\\ f(n)*g(p)&p\mid n \end{cases} \]
\(f(p)\) 为一个关于 \(p\) 的简单有理函数
\(g(p)=\dfrac{f(p^{k+1})}{f(p^k)},k\ge1\) 为一个关于 \(p\) 的简单函数
欧拉函数
\(f(p)=p-1,g(p)=p\)
莫比乌斯函数
\(f(p)=-1,g(p)=0\)
约数
\(f(p)=2,g(p)=\dfrac{h(p)+2}{h(p)+1},h(p)=1,h(n)=h(p)+1\)
约数和
\(f(p)=1+p,g(p)=\dfrac{h(p)*p+1}{h(p)},h(p)=1+p,h(n)=h(p)*p+1\)
筛法求约数个数
\(d(i)\) 表示 \(i\) 的约数个数
\(num(i)\) 表示 \(i\) 的最小质因子的个数
由于 \(n=\prod_i p_i^{a_i}\),则有 \(d(n)=\prod_i(a_i+1)\)
根据欧拉筛有三种情况
- \(i\) 为质数: 此时易知 \(d(i)=2,num(i)=1\)。
- \(i\) 不被 \(x\) 整除: 此时 \(\gcd(i,x)=1\),即 \(d(i*x)=d(i)*d(x),num(i*x)=1\)。
- \(i\) 被 \(x\) 整除: 此时可以知道 \(x\) 为 \(i*x\) 的最小质因子,可得 \(num(i*x)=num(i)+1\)。 然后因为 \(d(i)=(a_1+1)\prod_{i=2}(a_i+1)\),\(d(i*x)=(a_1+1+1)\prod_{i=2}(a_i+1)\) 所以 \(d(i*x)=\dfrac{d(i)}{(a_1+1)}(a_1+1+1)=\dfrac{d(i)}{num(i)+1}(num(i*x)+1)=\dfrac{d(i)}{num(i*x)}(num(i*x)+1)\)
模版
筛法求约数和
\(sd(i)\) 表示 \(i\) 的约数和
\(sp(i)\) 表示首项为 \(1\),公比为 \(i\) 的最小质因子的等比数列的和
\(n=\prod_ip_i^{a_i}\)
\(sd(n)=(1+p_1+p_1^2+...+p_1^{a_1})(1+p_2+p_2^2+...+p_2^{a_2})...(1+p_k+p_k^2+...+p_k^{a_k})\)
根据欧拉筛有三种情况
- \(i\) 为质数: 此时易知 \(sd(i)=1+i,sp(i)=1+i\)。
- \(i\) 不被 \(x\) 整除: 此时 \(\gcd(i,x)=1\),即 \(sd(i*x)=sd(i)*sd(x),sp(i*x)=1+x\)。
- \(i\) 被 \(x\) 整除: 此时可以知道 \(x\) 为 \(i*x\) 的最小质因子,可得 \(sp(i*x)=sp(i)*x+1\)。 然后因为 \(sd(i)=(1+p_1+p_1^2+...+p_1^{a_1})\prod\),\(sd(i*x)=(1+p_1+p_1^2+...+p_1^{a_1}+p_1^{a_1+1})\prod\) 所以 \(sd(i*x)=\dfrac{sd(i)}{sp(i)}sp(i*x)\)