杜教筛 & Powerful Number 筛
Posted LarsWerner
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了杜教筛 & Powerful Number 筛相关的知识,希望对你有一定的参考价值。
迪利克雷卷积
对于数论函数 \\(F\\),\\(G\\),我们定义迪利克雷卷积的结果 \\(H=F*G\\) 为
有些好的性质,比如:对于积性函数 \\(F\\) 与 \\(G\\),其迪利克雷卷积 \\(F*G\\) 也是积性函数;而在迪利克雷卷积的意义下,积性函数 \\(F\\) 的逆也是积性函数(逆满足 \\(F^-1*F=e\\))。
当公因式是完全积性函数时,点乘对迪利克雷卷积有分配律(下式中要求 \\(X\\) 为完全积性函数):
杜教筛
假设我们对于积性函数 \\(f\\),要求出 \\(f\\) 的前缀和,即 \\(\\sum_i\\le nf_i\\)。我们找到积性函数 \\(g\\),设 \\(h=f*g\\)。设 \\(S_f\\) 表示 \\(f\\) 的前缀和,则有:
把 \\(d>1\\) 的项提到左边去,得到
我们把 \\(\\le n^2/3\\) 的 \\(S_f\\) 全部线性筛处理了,然后按上面的式子递归算,最后得到的处理 \\(S_f\\) 的复杂度是 \\(O(n^2/3)\\)。
一些常见恒等式
关于 \\(\\mu\\):
-
\\(\\mu*I=\\epsilon\\)
-
\\((\\mu \\cdot id_k)*id_k=(\\mu\\cdot id_k)*(I\\cdot id_k)=(\\mu \\cdot I)*id_k=\\epsilon\\)
-
\\(\\mu^2=\\sum_d^2\\mid n \\mu(d)\\)
有了这个就可以求 \\(\\mu^2\\) 的前缀和,即\\[\\beginaligned \\sum_i=1^n \\mu(i)^2&=\\sum_i=1^n\\sum_d^2\\mid i\\mu(i)\\\\ &=\\sum_d=1^\\sqrtn \\mu(d)\\sum_d^2\\mid i1\\\\ &=\\sum_d=1^\\sqrtn \\mu(d)\\lfloor\\fracnd^2\\rfloor \\endaligned \\]然后就可以 \\(O(\\sqrt n)\\) 求了。
关于 \\(\\varphi\\):
- \\(\\varphi*I=id\\)
- \\((\\varphi \\cdot id_k)*id_k=(\\varphi\\cdot id_k)*(I\\cdot id_k)=(\\varphi \\cdot I)*id_k=id_k+1\\)
- \\(\\varphi(ij)=\\frac\\varphi(i)\\varphi(j)\\gcd(i,j)\\varphi(\\gcd(i,j))\\)
不断地带 \\(\\varphi(x)=x\\prod_d\\mid x\\fracd-1d\\) 即可。
BZOJ3512 DZY Loves Math IV
对于积性函数的性质的应用。
一个比较有趣的技巧:对于 \\(x\\),设其为 \\(x=\\prod p_i^q_i\\),我们设 \\(q=\\prod p_i\\),\\(p=\\fracxq\\),我们考虑直接求 \\(\\varphi\\) 的式子,每个因数只有在第一次会有特殊处理,其他情况都是直接乘上,所以 \\(\\varphi(x)=p\\varphi(q)\\),且对于任意 \\(i\\),都有 \\(\\varphi(ix)=p\\varphi(iq)\\)。然后由于 \\(q\\) 每个数都只有一次项,所以有很多互质的性质,可以在积性函数上得以体现。
设 \\(S(n,m)=\\sum_i=1^m\\varphi(i\\times n)\\),我们把 \\(n\\) 拆成 \\(pq\\),则有
然后直接递推即可,复杂度分析和杜教筛相似。
LOJ6686 Stupid GCD
求 \\(\\sum_i=1^n\\gcd(\\lfloor\\sqrt[3]i\\rfloor,i)\\)。
考虑 \\(n=k^3+1\\) 的情况。如果不是的话后面应该还要有一项,那一项单独处理是类似(这么写只是因为一开始漏考虑了…)。
\\(\\varphi\\cdot id_k\\) 显然是可以杜教筛的(上面说过),于是就可以做了。
Powerful Number 筛
定义一个数为 Powerful Number,当且仅当它的每个质因子次数都 \\(>2\\)。由于每个 PN 都可以表示成 \\(x^2y^3\\),于是可以发现 \\(\\le n\\) 的 PN 个数为 \\(O(\\sqrt n)\\)。
我们需要求出积性函数 \\(f(x)\\) 的前缀和,考虑构造积性函数 \\(g(x),h(x)\\),满足 \\(f=g*h\\),且 \\(f(p)=g(p)\\)。此时我们发现 \\(f(p)=g(p)h(1)+g(1)h(p)\\),由于 \\(g(1)=h(1)=1\\),于是 \\(h(p)=0\\)。对于积性函数,如果它在质数处取 \\(0\\),那么显然它只有在 PN 处才可能有值。
于是我们要求的
由于 \\(h\\) 只在 PN 处有值,所以我们相当于只需要算 \\(\\sqrtn\\) 个 \\(g\\) 的前缀和在 \\(\\lfloor \\fracni \\rfloor\\) 处的值即可。于是我们只需要对 \\(g\\) 做杜教筛即可。
还有一件事情,就是如何确定 \\(h\\)。我们按照 \\(h\\) 的定义式进行处理
由于 PN 的质因子 \\(p\\) 一定 \\(\\le \\sqrt n\\),于是就可以 \\(O(\\sqrt n\\log^2 n)\\) 求出所有所需的 \\(h\\) 了。
找 PN 的过程枚举每个 \\(p\\) 的次数,dfs 即可。
LG5325 【模板】Min25筛
题目中 \\(f(p^k)=p^k(p^k-1)\\)。于是 \\(f(p)=p(p-1)\\)。我们取积性函数 \\(g=id\\cdot \\varphi\\) 即可。前面说到过 \\((id\\cdot varphi)*id=id_2\\),直接杜教筛。
这题还有一个好处,由于 \\(g=id\\cdot \\varphi\\),\\(g(p^k)=(p-1)p^2k-1\\),我们可以手算出 \\(h(p^k)=(k-1)p^k(p-1)\\)。
LOJ6053 简单的函数
题目中 \\(f(p^c)=p\\oplus c\\)。于是 \\(f(p)=p\\oplus 1\\),即在 \\(p=2\\) 时 \\(f(p)=3\\),其余时候 \\(f(p)=p-1\\)。但是这个 \\(g\\) 的前缀和并不好求。这时候,我们考虑直接令 \\(g(p)=\\varphi\\),并且根据 \\(h\\) 的定义式修改 \\(h\\)。这时候的 \\(h\\) 就不符合只有 PN 处有值的性质了。但是我们发现增加的有值的地方只会是 PN 乘上 \\(2\\)。所以复杂度仍然正确。
杜教筛
快速求一个积性函数 (f) 的前缀和,
记为 (S)
[S(n)=sum_{i=1}^{n} f(i)]
考虑一个积性函数 (g)
[ egin{aligned} & sum_{i=1}^{n}(f*g)(i) =& sum_{i=1}^{n}sum_{d|n}^{i}f(d)g(frac{i}{n}) =& sum_{d=1}^ng(d)sum_{i=1}^{frac{n}{d}}f(i) =& sum_{d=1}^{n}g(d)S(frac{n}{d}) =& sum_{d=2}^ng(d)S(frac{n}{d})+g(1) imes S(n) end{aligned} ]
所以我们得到了最重要的式子:
[ g(1)S(n)=sum_{i=1}^{n}(f*g)(i)-sum_{d=2}^ng(d)S(frac{n}{d}) ]
所以我们只要构造出一个 (g) ,我们能快速求出它的前缀和以及 (f * g) 的前缀和,那么对后面的整数分块, 复杂度 (O(n^{frac{3}{4}})) , 如果预处理到 (5e6), 复杂度近似为 (O(n^{frac{2}{3}}))。
伪代码:
ll GetSum(int n) { // 算 f 前缀和的函数
//记忆化
ll ans = sum( (f * g)(n) ); // 算 f * g 的前缀和
// 以下这个 for 循环是数论分块
for(ll l = 2, r; l <= n; l = r + 1) { // 注意从 2 开始
r = (n / (n / l));
ans -= (g_sum(r) - g_sum(l - 1)) * GetSum(n / l);
// g_sum 是 g 的前缀和
// 递归 GetSum 求解
} return Sum(n) = ans;//记忆化
}
常用公式:
[mu * 1 = epsilon]
[varphi * 1=Id]
一个小小的拓展:
求 (sum_{i=1}^nvarphi(i) imes i)
首先来了解一个结论:
[(varphi imes Id) * Id=n^2]
(手推一下)
这题就是求 (f=varphi imes Id) 的前缀和,
令 (g=Id)
[g(1)S(n)=sum_{i=1}^n(f*g)(i)-sum_{d=2}^ng imes S(frac{n}{d})]
[(f*g)(n)=n^2]
((f*g)(n)) 的前缀和为 (frac{n(n+1)(2n+1)}{6}).
然后就可以筛了。
以上是关于杜教筛 & Powerful Number 筛的主要内容,如果未能解决你的问题,请参考以下文章