do_while_true

一言(ヒトコト)

数论

莫反,欧拉反演

常用结论:

  • \(\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\)

\[\begin{aligned} F(n)&=\sum_{i=1}^n\sum_{d|i}h(d)g(\frac{i}{d})\\ &=\sum_{d=1}^n h(d)\sum_{i=1}^{\left\lfloor \frac{n}{d}\right\rfloor}g(i)\\ &=\sum_{d=1}^{n}h(d)G(\left\lfloor \frac{n}{d}\right\rfloor) \end{aligned} \]

杜教筛说的是,欲求 \(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})\)

  1. \(f=g*h,F(n)=\sum_{d=1}^n h(d)G(\left\lfloor \frac{n}{d}\right\rfloor)\)
  2. \(G(n)\),移项,基本和组往下递归。
  3. 直接递归需要记忆化复杂度 \(\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})\) 的了。

  1. \(f=g*h,F(n)=\sum_{d=1}^n h(d)G(\left\lfloor \frac{n}{d}\right\rfloor)\)
  2. \(F(n)\),构造 \(g\) 使得 \(f,g\)\(p^k\) 处取值相同,这样 \(h\) 仅在 pn 处有取值。
  3. 直接 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})\) 的了。

posted @ 2023-04-29 17:16  do_while_true  阅读(57)  评论(1编辑  收藏  举报