数论
莫反,欧拉反演
常用结论:
- \(\mu*1=\epsilon,\varphi*1=id\).
- \(\mu^2(n)=\sum_{d^2|n}\mu(d)\).
- \(d(ij)=\sum_{x|i}\sum_{y|j}[gcd(x,y)=1]\).
- \(\varphi(xy)=\frac{\varphi(x)\varphi(y)\gcd(x,y)}{\varphi(\gcd(x,y))}\).
杜教筛
积性函数 \(f=g*h\),它们的前缀和分别是 \(F,G,H\),思路是将 \(F(n)\) 写出然后交换求和号枚举 \(h\):
杜教筛说的是,欲求 \(G(n)\),将 \(d=1\) 这一项单独拎出来移项,这样就有 \(h(1)G(n)=F(n)-\sum_{d>1}^nh(d)G(\left\lfloor \frac{n}{d}\right\rfloor)\),对右边整除分块,这要求 \(F\) 和 \(H\) 都能快速算出。
这相当于求出 \(g\) 的所有基本和组处的取值,然后对于这些位置继续往下递归它们的基本和组。需要记忆化搜索剪枝。
现在来算复杂度,注意到基本和组的基本和组依然属于原先的基本和组,也就是 \(\lfloor\frac{\lfloor\frac{n}{a}\rfloor}{b}\rfloor=\lfloor\frac{n}{ab}\rfloor\),依据整除分块,复杂度实际上是 \(\sum_{i=1}^{\sqrt n}(\sqrt i+\sqrt{\frac{n}{i}})\),不难积分出复杂度为 \(\mathcal{O}(n^{3/4})\).
如果能线性筛预处理出 \(G\) 在 \(n\) 比较小的时候的前缀和,取 \(B= \mathcal{O}(n^{2/3})\),这样复杂度中 \(\sqrt i\) 直接查表就能直接去掉,而要保证 \(\frac{n}{i}\geq n^{2/3}\) 那么 \(i\leq n^{1/3}\),这样复杂度就是 \(\sum_{i=1}^{n^{1/3}}\sqrt{\frac{n}{i}}= \mathcal{O}(n^{2/3})\).
- \(f=g*h,F(n)=\sum_{d=1}^n h(d)G(\left\lfloor \frac{n}{d}\right\rfloor)\).
- 求 \(G(n)\),移项,基本和组往下递归。
- 直接递归需要记忆化复杂度 \(\mathcal{O}(n^{3/4})\),小的部分线性筛预处理,复杂度是 \(\mathcal{O}(n^{2/3})\).
Powerful number 筛
Powerful number 是指标准分解中质因数的指数均 \(>1\) 的数,其一定能表示成 \(a^2b^3\) 的形式,如果让 \(b\) 中无平凡因子那么这个表示就是唯一的。那么现在就可以来估计一下 \(n\) 以内 pn 的个数:\(\sum_{b=1}^{\sqrt[3]{n}}\frac{n}{b^2}\),积分一下就得到 \(\mathcal{O}(n^{1/2})\).
Powerful number 筛的核心式子与杜教筛完全一致 \(F(n)=\sum_{d=1}^n h(d)G(\left\lfloor \frac{n}{d}\right\rfloor)\).现在想求 \(F(n)\),构造 \(g\) 使得 \(g\) 和 \(f\) 在素数处的取值完全相同,由于 \(f=g*h\) 可看出 \(h\) 仅在 powerful number 处有值。如果 \(G\) 能快速算出,\(h(d)\) 根据 \(f=g*h\) 也能快速算出,这样只需要暴力 dfs 枚举所有 powerful number 作为 d,然后计算 \(f\),这样复杂度就是 \(\mathcal{O}(n^{1/2})\) 的了。
- \(f=g*h,F(n)=\sum_{d=1}^n h(d)G(\left\lfloor \frac{n}{d}\right\rfloor)\).
- 求 \(F(n)\),构造 \(g\) 使得 \(f,g\) 在 \(p^k\) 处取值相同,这样 \(h\) 仅在 pn 处有取值。
- 直接 dfs 枚举所有 \(d\) 计算 \(F(n)\) 即可。复杂度是 pn 个数 \(\mathcal{O}(\sqrt n)\).
贝尔级数
对于积性函数 \(f\) 其质数 \(p\) 对应的贝尔级数 \(\sum\limits_if(p^i)x^i\),积性函数的狄利克雷卷积就对应贝尔级数的普通卷积,可以用来构造杜教筛需要的函数。
- \(\epsilon_p(x)=1\).
- \(I_p(x)=\frac{1}{1-x}\).
- \((id_k)_p(x)=\sum_{i\geq 0}p^{ik}x^i=\frac{1}{1-p^kx}\).
- \(\mu=I^{-1}\):\(\mu_p(x)=1-x\),前面是狄利克雷乘法逆,这也说明为什么 \(\mu\) 本质上是在质因子维度上作高维差分(类比 ogf \(1-x\) 是在作差分)。
- \((\mu^2)_p(x)=1+x\),这里 \(\mu^2\) 是点乘。
- \(\varphi=id*\mu\):\(\varphi_p(x)=\frac{1-x}{1-px}\).
- \(d=\sigma_0=I*I\):\(d_p(x)=\frac{1}{(1-x)^2}\).
- \(\sigma_k=I*id_k\):\((\sigma_k)_p(x)=\frac{1}{(1-x)(1-p^kx)}\).
例题
DIVCNT2
求 \(\sum_{i=1}^n d(i^2)\).
\(f(i)=d(i^2)\) 的贝尔级数是 \(<1,3,5,....>=\frac{1+x}{(1-x)^2}\),于是 \(f=\mu^2 * d\).
\(\mu^2(n)\) 前缀和是 \(\sum_{i=1}^{\sqrt n}\mu(i)\lfloor\frac{n}{i^2}\rfloor\) 可以整除分块算。
\(d=1 * 1\) 的前缀和可以化成 \(\sum_{d=1}^{n}\lfloor\frac{n}{d}\rfloor\) 然后整除分块算。
我们知道基本和组的基本和组依然是基本和组,所以记忆化搜索,小的线性筛出来,复杂度就是 \(\mathcal{O}(n^{2/3})\) 的了。