杜教筛 & Powerful Number 筛

Posted LarsWerner

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了杜教筛 & Powerful Number 筛相关的知识,希望对你有一定的参考价值。

迪利克雷卷积

对于数论函数 \\(F\\)\\(G\\),我们定义迪利克雷卷积的结果 \\(H=F*G\\)

\\[H_n=\\sum_d\\mid nF_d G_\\fracnd \\]

有些好的性质,比如:对于积性函数 \\(F\\)\\(G\\),其迪利克雷卷积 \\(F*G\\) 也是积性函数;而在迪利克雷卷积的意义下,积性函数 \\(F\\) 的逆也是积性函数(逆满足 \\(F^-1*F=e\\))。

当公因式是完全积性函数时,点乘对迪利克雷卷积有分配律(下式中要求 \\(X\\) 为完全积性函数):

\\[(A\\cdot X)*(B\\cdot X)=(A*B)\\cdot X \\]

杜教筛

假设我们对于积性函数 \\(f\\),要求出 \\(f\\) 的前缀和,即 \\(\\sum_i\\le nf_i\\)。我们找到积性函数 \\(g\\),设 \\(h=f*g\\)。设 \\(S_f\\) 表示 \\(f\\) 的前缀和,则有:

\\[\\beginaligned S_h(n)&=\\sum_i=1^n\\sum_d\\mid ig_df_i/d\\\\ &=\\sum_d=1^ng_d\\sum_i=1^\\lfloor n/d\\rfloor f_i\\\\ &=\\sum_d=1^ng_dS_f(\\lfloor n/d\\rfloor) \\endaligned \\]

\\(d>1\\) 的项提到左边去,得到

\\[S_f(n)=S_h(n)-\\sum_d=2^ng_dS_f(\\lfloor n/d\\rfloor) \\]

我们把 \\(\\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\\),则有

\\[\\beginaligned S(n,m)&=\\sum_i=1^m\\varphi(iq)p\\\\ &=p\\sum_i=1^m\\gcd(i,q)\\times \\varphi(\\fracq\\gcd(i,q))\\varphi(i)\\\\ &=p\\sum_i=1^m\\varphi(i)\\varphi(\\fracq\\gcd(i,q))\\sum_d\\mid \\gcd(i,q)\\varphi(d)\\\\ &=p\\sum_i=1^m\\varphi(i)\\sum_d\\mid i,d\\mid q\\varphi(\\fracqd\\gcd(i,q))\\\\ &=p\\sum_i=1^m\\varphi(i)\\sum_x\\mid i,x\\mid q\\varphi(\\fracdx)\\\\ &=p\\sum_d\\mid q^n\\varphi(\\fracqd)\\sum_d\\mid i^m\\varphi(i)\\\\ &=p\\sum_d\\mid q^n\\varphi(\\fracqd)S(d,\\lfloor\\fracmd\\rfloor) \\endaligned \\]

然后直接递推即可,复杂度分析和杜教筛相似。

LOJ6686 Stupid GCD

\\(\\sum_i=1^n\\gcd(\\lfloor\\sqrt[3]i\\rfloor,i)\\)

考虑 \\(n=k^3+1\\) 的情况。如果不是的话后面应该还要有一项,那一项单独处理是类似(这么写只是因为一开始漏考虑了…)。

\\[\\beginaligned \\sum_i=1^n\\gcd(\\lfloor\\sqrt[3]i\\rfloor,i) &=\\sum_i=1^n\\sum_d\\mid \\lfloor\\sqrt[3]i\\rfloor,d\\mid i \\varphi(d)\\\\ &=\\sum_i=1^k-1\\sum_j=i^3^(i+1)^3-1\\sum_d\\mid i,d\\mid j\\varphi(d)\\\\ &=\\sum_d=1^k-1\\varphi(d)\\sum_d\\mid i^k-1\\lfloor\\fraci^3+3i^2+3id\\rfloor-\\lfloor\\fraci^3-1d\\rfloor\\\\ &=\\sum_d=1^k-1\\varphi(d)\\sum_i=1^\\lfloor\\frack-1d\\rfloor3di^2+3i+1\\\\ &=3\\sum_d=1^k-1\\varphi(d)d\\sum_i=1^\\lfloor\\frack-1d\\rfloori^2+\\sum_d=1^k-1\\varphi(d)\\sum_i=1^\\frack-1d3i+1 \\endaligned \\]

\\(\\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 处才可能有值。

于是我们要求的

\\[\\sum_i=1^n f(i)=\\sum_ij g(i)h(j)\\\\\\ = \\sum_i\\le n h(i) \\sum_j=1^n/i g(j) \\]

由于 \\(h\\) 只在 PN 处有值,所以我们相当于只需要算 \\(\\sqrtn\\)\\(g\\) 的前缀和在 \\(\\lfloor \\fracni \\rfloor\\) 处的值即可。于是我们只需要对 \\(g\\) 做杜教筛即可。

还有一件事情,就是如何确定 \\(h\\)。我们按照 \\(h\\) 的定义式进行处理

\\[f(p^k)=\\sum_i+j=kg(p^i)h(p^j)\\\\ h(p^k)=f(p^k)-\\sum_i=0^k-1h(p^i)g(p^k-i) \\]

由于 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\\)。所以复杂度仍然正确。

https://loj.ac/s/1764869

杜教筛

快速求一个积性函数 (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 筛的主要内容,如果未能解决你的问题,请参考以下文章

51nod-1239&1244欧拉函数之和&莫比乌斯函数之和 杜教筛

杜教筛

杜教筛

狄利克雷卷积&&杜教筛&&莫比乌斯反演

[模板] 积性函数 && 杜教筛

数论狄利克雷卷积及其快速计算方法及杜教筛