整理的算法模板合集: ACM模板

点我看算法全家桶系列!!!

实际上是一个全新的精炼模板整合计划


写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无任何商业用途。因个人实力时间等原因,本文并非完全原创,请大家见谅。

目录

  • 《算法竞赛中的初等数论》正文 0x00整除、0x10 整除相关(ACM / OI / MO)(十五万字符数论书)
  • 0x30 积性函数
    • 0x31 常见积性函数
    • 0x32 莫比乌斯函数
    • 0x33 狄利克雷卷积
      • 0x33.1 常见积性函数的卷积
      • 0x33.2 O(nlogn)O(nlogn)O(nlogn) 的卷积预处理

《算法竞赛中的初等数论》正文 0x00整除、0x10 整除相关(ACM / OI / MO)(十五万字符数论书)

《算法竞赛中的初等数论》(信奥 / 数竞 / ACM)前言、后记、目录索引(十五万字符的数论书)

全文目录索引链接: https://fanfansann.blog.csdn.net/article/details/113765056


本章内容不多,比较简单,非常基础,建议完全掌握,包括所有的概念和证明。

0x30 积性函数

一些定义

  • 数论函数
    定义域为正整数的函数称为数论函数。

  • 积性函数
    对于数论函数 fff,若任意互质的 p,qp,qp,q 都有 f(pq)=f(p)f(q)f(pq)=f(p)f(q)f(pq)=f(p)f(q),则称 fff 是积性函数。

  • 完全积性函数
    对于数论函数 fff,若任意 p,qp,qp,q 都有 f(pq)=f(p)f(q)f(pq)=f(p)f(q)f(pq)=f(p)f(q),则称 fff 是完全积性函数

  • 定义逐点加法
    (f+g)(x)=f(x)+g(x)(f + g)(x) = f(x) + g(x)(f+g)(x)=f(x)+g(x),(f⋅g)(x)=f(x)g(x)(f \cdot g)(x) = f(x)g(x)(f⋅g)(x)=f(x)g(x)

定理30.1: 积性函数一定满足 f(1)=1f(1) = 1f(1)=1。


考虑证明:

显然 111 与任何数都互质,满足积性函数的定义,那么我们假设存在一个正整数 aaa 满足 f(a)!=0f(a)!=0f(a)!=0,显然有:f(a)=f(1×a)=f(1)×f(a)f(a) = f(1\times a) = f(1)\times f(a)f(a)=f(1×a)=f(1)×f(a),两端同除 f(a)f(a)f(a) ,得:f(1)=1f(1) = 1f(1)=1,性质得证 □


定理30.2: 对于一个大于 111的正整数 NNN ,根据唯一分解定理有 N=∏piaiN = \prod p_i^{a_i}N=∏piai​​ ,则对于任意积性函数 fff ,有: f(N)=f(∏piai)=∏f(piai)\displaystyle f(N) = f(\prod p_i^{a_i}) = \prod f(p_i^{a_i})f(N)=f(∏piai​​)=∏f(piai​​)若 fff完全积性,则 f(N)=∏f(pi)ai\displaystyle f(N) = \prod f(p_i)^{a_i}f(N)=∏f(pi​)ai​。

由此可得推论:凡是积性函数均可用线性筛法求解

性质30.3: 对于一个大于 111 的整数由唯一分解定理有: n=∏piain = \prod p_i^{a_i}n=∏piai​​,其中 pip_ipi​ 为互不相同的素数。

对于一个积性函数 fff,f(n)=f(∏piai)=∏f(piai)f(n) = f(\prod p_i^{a_i}) = \prod f(p_i^{a_i})f(n)=f(∏piai​​)=∏f(piai​​)(不互质不能提出来)

对于一个完全积性函数 fff,f(n)=∏f(pi)aif(n) = \prod f(p_i)^{a_i}f(n)=∏f(pi​)ai​

性质30.4: 若 f(x)f(x)f(x) 和 g(x)g(x)g(x) 均为积性函数,则以下函数也为积性函数:

h(x)=f(xp)h(x)=fp(x)h(x)=f(x)g(x)h(x)=∑d∣xf(d)g(xd)\begin{aligned} h(x)&=f(x^p)\\ h(x)&=f^p(x)\\ h(x)&=f(x)g(x)\\ h(x)&=\sum_{d\mid x}f(d)g(\frac{x}{d}) \end{aligned} h(x)h(x)h(x)h(x)​=f(xp)=fp(x)=f(x)g(x)=d∣x∑​f(d)g(dx​)​

0x31 常见积性函数

  • φ(n)φ(n)φ(n) -欧拉函数 φ(n)=∑i=1n[i⊥n]\displaystyle\varphi(n)=\sum_{i=1}^n[i\perp n]φ(n)=i=1∑n​[i⊥n]

  • μ(n)μ(n)μ(n) -莫比乌斯函数,关于非平方数的质因子数目μ(n)={1n=10∃d>1,d2∣n(−1)ω(n)otherwise\mu(n) = \begin{cases}1 & n=1 \\ 0 & \exists d>1,d^{2} \mid n \\ (-1)^{\omega(n)} & \texttt{otherwise}\end{cases}μ(n)=⎩⎪⎨⎪⎧​10(−1)ω(n)​n=1∃d>1,d2∣notherwise​,其中 ω(n)\omega(n)ω(n) 表示 nnn 的本质不同质因子个数,它是一个加性函数。

加性函数
此处的加性函数指数论上的加性函数 (Additive function)。对于加性函数 f⁡\operatorname{f}f,当整数 a,ba,ba,b 互质时,均有 f⁡(ab)=f⁡(a)+f⁡(b)\operatorname{f}(ab)=\operatorname{f}(a)+\operatorname{f}(b)f(ab)=f(a)+f(b)。
应与代数中的加性函数 (Additive map) 区分。

  • gcd⁡(n,k)\gcd(n,k)gcd(n,k) -最大公因数,当 kkk 固定的情况

  • 除数函数:σk(n)=∑d∣ndk\sigma_{k}(n)=\sum_{d\mid n}d^{k}σk​(n)=∑d∣n​dk

    • σ0(n)\sigma_{0}(n)σ0​(n) 通常简记作 d⁡(n)\operatorname{d}(n)d(n) 或 τ(n)\tau(n)τ(n),
    • σ1(n)\sigma_{1}(n)σ1​(n) 通常简记作 σ(n)\sigma(n)σ(n)。
  • d(n)d(n)d(n) - nnn 的正因子数目 d(n)=∑i∣n1d(n)=\displaystyle\sum_{i|n}1d(n)=i∣n∑​1

  • σ(n)σ(n)σ(n) - nnn 的所有正因子之和 σ(n)=∑d∣nd\displaystyle \sigma(n)=\sum_{d|n}dσ(n)=d∣n∑​d

  • 1(n)1(n)1(n) -不变函数,定义为 1(n)=1\displaystyle 1(n) = 11(n)=1 (完全积性)

  • id(n)id(n)id(n) -单位函数(恒等函数),定义为 id(n)=nid(n) = nid(n)=n(完全积性)

  • idk(n)idk(n)idk(n) -幂函数,对于任何复数、实数 kkk,定义为 idk(n)=nkidk(n) = n^kidk(n)=nk (完全积性)

  • ε(n)ε(n)ε(n) -定义为:ε(n)=[n=1]ε(n)=[n=1]ε(n)=[n=1],若n=1n = 1n=1,ε(n)=1ε(n)=1ε(n)=1;若 n>1n > 1n>1,ε(n)=0ε(n)=0ε(n)=0 。即: 对于狄利克雷卷积的乘法单位 / 狄利克雷特卷积的单位元,(完全积性)

  • λ(n)λ(n)λ(n) -刘维尔函数,关于能整除 nnn 的质因子的数目

  • γ(n)γ(n)γ(n),定义为 γ(n)=(−1)ω(n)\displaystyle γ(n)=(-1)^ω(n)γ(n)=(−1)ω(n),在此加性函数 ω(n)ω(n)ω(n) 是不同能整除 nnn 的质数的数目

  • 另外,所有狄利克雷特征均是完全积性的。

积性函数 欧拉函数 已在 0x14.1 欧拉函数 中讲解过,这里不再赘述。

0x32 莫比乌斯函数

定义

μ(n)={0∃i∈[1,m],Ci>1(−1)m∀i∈[1,m],Ci=1\mu(n) = \left\{ \begin{matrix} 0 & \exists i \in [1,m],C_i>1 \\ (-1)^m & \forall i \in [1,m],C_i=1 \end{matrix} \right.μ(n)={0(−1)m​∃i∈[1,m],Ci​>1∀i∈[1,m],Ci​=1​

构造莫比乌斯函数

莫比乌斯函数可以理解为一个容斥原理的映射

性质32.1:

∑d∣nμ(d)={1n=10n≠1\sum_{d\mid n}\mu(d)= \begin{cases} 1&n=1\\ 0&n\neq 1\\ \end{cases} d∣n∑​μ(d)={10​n=1n​=1​

即 ∑d∣nμ(d)=ε(n)\sum_{d\mid n}\mu(d)=\varepsilon(n)∑d∣n​μ(d)=ε(n),μ∗1=ε\mu * 1 =\varepsilonμ∗1=ε,其中 ∗*∗ 是指 DirichletDirichletDirichlet 卷积。

证明

设 n=∏i=1kpici,n′=∏i=1kpi\displaystyle n=\prod_{i=1}^k{p_i}^{c_i},n'=\prod_{i=1}^k p_in=i=1∏k​pi​ci​,n′=i=1∏k​pi​

那么 ∑d∣nμ(d)=∑d∣n′μ(d)=∑i=0kCki⋅(−1)i=(1+(−1))k\displaystyle\sum_{d\mid n}\mu(d)=\sum_{d\mid n'}\mu(d)=\sum_{i=0}^k C_k^i\cdot(-1)^i=(1+(-1))^kd∣n∑​μ(d)=d∣n′∑​μ(d)=i=0∑k​Cki​⋅(−1)i=(1+(−1))k

根据二项式定理,易知该式子的值在 k=0k=0k=0 即 n=1n=1n=1 时值为 111 否则为 000,这也同时证明了 ∑d∣nμ(d)=[n=1]=ε(n)\displaystyle\sum_{d\mid n}\mu(d)=[n=1]=\varepsilon(n)d∣n∑​μ(d)=[n=1]=ε(n) 以及 μ∗1=ε\mu\ast 1=\varepsilonμ∗1=ε

性质32.2:

[gcd⁡(i,j)=1]=∑d∣gcd⁡(i,j)μ(d)\displaystyle [\gcd(i,j)=1]=\sum_{d\mid\gcd(i,j)}\mu(d)[gcd(i,j)=1]=d∣gcd(i,j)∑​μ(d)

直接证明:如果看懂了上一个结论,这个结论稍加思考便可以推出:如果 gcd⁡(i,j)=1\gcd(i,j)=1gcd(i,j)=1 的话,那么代表着我们按上个结论中枚举的那个 nnn 是 111,也就是式子的值是 111,反之,有一个与 [gcd⁡(i,j)=1][\gcd(i,j)=1][gcd(i,j)=1] 相同的值:000
%
利用 ε\varepsilonε 函数:[gcd⁡(i,j)=1]=ε[gcd⁡(i,j)]=μ∗I=∑d∣gcd⁡(i,j)μ(d)[\gcd(i,j)=1]=ε[\gcd(i,j)]=\mu *I=\sum_{d|\gcd(i,j)}\mu(d)[gcd(i,j)=1]=ε[gcd(i,j)]=μ∗I=d∣gcd(i,j)∑​μ(d)

证明 μ(x)\mu(x)μ(x) 是积性函数

设 a,ba,ba,b:

a=p1α1×p2α2×⋯×pnαka=p_1^{\alpha_1}\times p_2^{\alpha_2}\times \cdots \times p_n^{\alpha_k}a=p1α1​​×p2α2​​×⋯×pnαk​​b=p1β1×p2β2×⋯×pnβtb=p_1^{\beta_1}\times p_2^{\beta_2}\times \cdots \times p_n^{\beta_t}b=p1β1​​×p2β2​​×⋯×pnβt​​a×b=p1α1×p2α2×⋯×pnαk×p1β1×p2β2×⋯×pnβta\times b=p_1^{\alpha_1}\times p_2^{\alpha_2}\times \cdots \times p_n^{\alpha_k}\times p_1^{\beta_1}\times p_2^{\beta_2}\times \cdots \times p_n^{\beta_t}a×b=p1α1​​×p2α2​​×⋯×pnαk​​×p1β1​​×p2β2​​×⋯×pnβt​​

若 μ(a)=0\mu(a)=0μ(a)=0或 μ(b)=0\mu(b)=0μ(b)=0,则 μ(a×b)=0\mu(a\times b)=0μ(a×b)=0(因为均含有 αor β>1\alpha\ \text{or}\ \beta>1α or β>1)

即 μ(a×b)=μ(a)×μ(b)\mu(a\times b)=\mu(a) \times \mu(b)μ(a×b)=μ(a)×μ(b)

若 μ(a)≠0\mu(a)≠0μ(a)​=0 或 μ(b)≠0\mu(b)≠0μ(b)​=0,则 μ(a×b)=(−1)k+t=(−1)k×(−1)t=μ(a)×μ(b)\mu(a\times b)=(-1)^{k+t}=(-1)^{k}\times(-1)^t=\mu(a) \times \mu(b)μ(a×b)=(−1)k+t=(−1)k×(−1)t=μ(a)×μ(b)

0x33 狄利克雷卷积

  • 定义: 若函数f,gf,gf,g为积性函数,则定义 f,gf,gf,g 的狄利克雷卷积为:

f∗g(n)=∑d∣nf(d)g(nd)f*g(n)=\sum_{d|n}f(d)g(\frac nd)f∗g(n)=d∣n∑​f(d)g(dn​)

计算的时候可以把枚举约数转换成枚举倍数,以调和级数 O(nlogn)O(nlogn)O(nlogn) 的复杂度求出 f∗gf∗gf∗g 的前 nnn 项。详见本文 0x33.2 O(nlogn)O(nlogn)O(nlogn) 的卷积预处理

  • 满足性质:

交换律:
f∗g(n)=∑d∣nf(d)g(nd)=∑d∣ng(d)f(nd)=g∗f(n)f*g(n)=\sum_{d|n}f(d)g(\frac nd)=\sum_{d|n}g(d)f(\frac nd)=g*f(n)f∗g(n)=d∣n∑​f(d)g(dn​)=d∣n∑​g(d)f(dn​)=g∗f(n)

结合律:

f∗g∗h(n)=∑d∣nf(d)∑t∣ndg(t)h(ndt)=∑d1d2d3=nf(d1)g(d2)h(d3)=f∗(g∗h)(n)f*g*h(n)=\sum_{d|n}f(d)\sum_{t|\frac nd}g(t)h(\frac n{dt})=\sum_{d_1d_2d_3=n}f(d_1)g(d_2)h(d_3)=f*(g*h)(n)f∗g∗h(n)=d∣n∑​f(d)t∣dn​∑​g(t)h(dtn​)=d1​d2​d3​=n∑​f(d1​)g(d2​)h(d3​)=f∗(g∗h)(n)

分配律: f∗(g+h)=f∗g+f∗hf * (g + h) = f * g + f * hf∗(g+h)=f∗g+f∗h

等式的性质: f=gf=gf=g 的充要条件是 f∗h=g∗hf*h=g*hf∗h=g∗h,其中数论函数 h(x)h(x)h(x) 要满足 h(1)≠0h(1)\ne 0h(1)​=0。

证明: 充分性是显然的。

证明必要性,我们先假设存在 xxx,使得 f(x)≠g(y)f(x)\ne g(y)f(x)​=g(y)。那么我们找到最小的 y∈Ny\in \mathbb{N}y∈N,满足 f(y)≠g(y)f(y)\ne g(y)f(y)​=g(y),并设 r=f∗h−g∗h=(f−g)∗hr=f*h-g*h=(f-g)*hr=f∗h−g∗h=(f−g)∗h。

则有:

r(y)=∑d∣y(f(d)−g(d))h(yd)=(f(y)−g(y))h(1)≠0\begin{aligned} r(y)&=\sum_{d\mid y}{(f(d)-g(d))h\left(\dfrac yd \right)}\\ &=(f(y)-g(y))h(1)\\ &\ne 0 \end{aligned} r(y)​=d∣y∑​(f(d)−g(d))h(dy​)=(f(y)−g(y))h(1)​=0​

则 f∗hf*hf∗h 和 g∗hg*hg∗h 在 yyy 处的取值不一样,即有 f∗h≠g∗hf*h\ne g*hf∗h​=g∗h。矛盾,所以必要性成立。

证毕

单位元:f∗ε=ff*\varepsilon=ff∗ε=f

逆元: 对于任何一个满足 f(x)≠0f(x)\ne 0f(x)​=0 的数论函数,如果有另一个数论函数 g(x)g(x)g(x) 满足 f∗g=εf*g=\varepsilonf∗g=ε,则称 g(x)g(x)g(x) 是 f(x)f(x)f(x) 的逆元。由 等式的性质 可知,逆元是唯一的。


根据定义显然有

ϵ=g∗f[n=1]=∑i∣nf(i)g(ni)[n=1]=f(1)g(n)+∑i∣n,i≠1f(i)g(ni)\begin{aligned}\epsilon&=g*f\\ [n=1]& =\quad\sum_{i\mid n} f(i) \ g\left(\frac{n}{i}\right)\\ [n=1]&= f(1) \ g(n)+\sum_{i\mid n,i\neq1}\ f(i)\ g\left(\frac {n}{i}\right)\\& \end{aligned}ϵ[n=1][n=1]​=g∗f=i∣n∑​f(i) g(in​)=f(1) g(n)+i∣n,i​=1∑​ f(i) g(in​)​

化简即可得到:

g(n)=[n=1]−∑i∣n,i≠1f(i)g(ni)f(1)\displaystyle g(n)=\cfrac { [n=1]-\displaystyle\sum_{i\mid n, i\neq1}\ f(i)\ g(\cfrac {n}{i}) }{\ f(1)}g(n)= f(1)[n=1]−i∣n,i​=1∑​ f(i) g(in​)​

重要性质: 若函数f,gf,gf,g为积性函数,则f∗gf*gf∗g也为积性函数( * 为狄利克雷特卷积)

两个积性函数的 Dirichlet 卷积也是积性函数

证明: 设两个积性函数为 f(x)f(x)f(x) 和 g(x)g(x)g(x),再记 h=f∗gh=f*gh=f∗g。

设 gcd⁡(a,b)=1\gcd(a,b)=1gcd(a,b)=1,则:

h(a)=∑d1∣af(d1)g(ad1),h(b)=∑d2∣bf(d2)g(bd2),h(a)=\sum_{d_1\mid a}{f(d_1)g\left(\dfrac a{d_1} \right)},h(b)=\sum_{d_2\mid b}{f(d_2)g\left(\dfrac b{d_2} \right)}, h(a)=d1​∣a∑​f(d1​)g(d1​a​),h(b)=d2​∣b∑​f(d2​)g(d2​b​),

所以:

h(a)h(b)=∑d1∣af(d1)g(ad1)∑d2∣bf(d2)g(bd2)=∑d∣abf(d)g(abd)=h(ab)\begin{aligned} h(a)h(b)&=\sum_{d_1\mid a}{f(d_1)g\left(\dfrac a{d_1} \right)}\sum_{d_2\mid b}{f(d_2)g\left(\dfrac b{d_2} \right)}\\ &=\sum_{d\mid ab}{f(d)g\left(\dfrac {ab}d \right)}\\ &=h(ab) \end{aligned} h(a)h(b)​=d1​∣a∑​f(d1​)g(d1​a​)d2​∣b∑​f(d2​)g(d2​b​)=d∣ab∑​f(d)g(dab​)=h(ab)​

所以结论成立。

证毕

积性函数的逆元也是积性函数

证明:我们设 f∗g=εf*g=\varepsilonf∗g=ε,并且不妨设 f(1)=1f(1)=1f(1)=1。考虑归纳法:

  • 若 nm=1nm=1nm=1,则 g(nm)=g(1)=1g(nm)=g(1)=1g(nm)=g(1)=1,结论显然成立;

  • 若 nm>1(gcd⁡(n,m)=1)nm>1(\gcd(n,m)=1)nm>1(gcd(n,m)=1),假设现在对于所有的 xy<nm(gcd⁡(x,y)=1)xy<nm(\gcd(x,y)=1)xy<nm(gcd(x,y)=1),都有 g(xy)=g(x)g(y)g(xy)=g(x)g(y)g(xy)=g(x)g(y),所以有:
    g(nm)=−∑d∣nm,d≠1f(d)g(nmd)=−∑a∣n,b∣m,ab≠1f(ab)g(nmab)g(nm)=-\sum_{d\mid nm,d\ne 1}{f(d)g\left(\dfrac {nm}d \right)}=-\sum_{a\mid n,b\mid m,ab\ne 1}{f(ab)g\left(\dfrac {nm}{ab} \right)} g(nm)=−d∣nm,d​=1∑​f(d)g(dnm​)=−a∣n,b∣m,ab​=1∑​f(ab)g(abnm​)
    又因为 nmab<nm\dfrac{nm}{ab}<nmabnm​<nm,所以有:
    g(nm)=−∑a∣n,b∣m,ab≠1f(ab)g(nmab)=−∑a∣n,b∣m,ab≠1f(a)f(b)g(na)g(mb)=f(1)f(1)g(n)g(m)−∑a∣n,b∣mf(a)f(b)g(na)g(mb)=g(n)g(m)−∑a∣nf(a)g(na)∑b∣mf(b)g(mb)=g(n)g(m)−ε(n)−ε(m)=g(n)g(m)\begin{aligned} g(nm)&=-\sum_{a\mid n,b\mid m,ab\ne 1}{f(ab)g\left(\dfrac {nm}{ab} \right)}\\\\ &=-\sum_{a\mid n,b\mid m,ab\ne 1}{f(a)f(b)g\left(\dfrac {n}{a} \right)g\left(\dfrac {m}{b} \right)}\\\\ &=f(1)f(1)g(n)g(m)-\sum_{a\mid n,b\mid m}{f(a)f(b)g\left(\dfrac {n}{a} \right)g\left(\dfrac {m}{b} \right)}\\\\ &=g(n)g(m)-\sum_{a\mid n}{f(a)g\left(\dfrac {n}{a} \right)}\sum_{b\mid m}{f(b)g\left(\dfrac {m}{b} \right)}\\\\ &=g(n)g(m)-\varepsilon(n)-\varepsilon(m)\\\\ &=g(n)g(m) \end{aligned} g(nm)​=−a∣n,b∣m,ab​=1∑​f(ab)g(abnm​)=−a∣n,b∣m,ab​=1∑​f(a)f(b)g(an​)g(bm​)=f(1)f(1)g(n)g(m)−a∣n,b∣m∑​f(a)f(b)g(an​)g(bm​)=g(n)g(m)−a∣n∑​f(a)g(an​)b∣m∑​f(b)g(bm​)=g(n)g(m)−ε(n)−ε(m)=g(n)g(m)​

综合以上两点,结论成立。

证毕

0x33.1 常见积性函数的卷积

性质0x33.1:∀f(n),e∗f(n)=f(n)\forall f(n),e*f(n)=f(n)∀f(n),e∗f(n)=f(n)

性质0x33.2:1∗1(n)=∑d∣n1=d(n)1*1(n)=\sum_{d|n}1=d(n)1∗1(n)=∑d∣n​1=d(n)

性质0x33.3:id∗1(n)=∑d∣nd=σ(n)id*1(n)=\sum_{d|n}d=\sigma(n)id∗1(n)=∑d∣n​d=σ(n)

性质0x33.4:μ∗1(n)=∑d∣nμ(d)×1(nd)=[n=1]=ε(n)\mu*1(n)=\sum_{d|n}\mu(d)\times 1(\cfrac{n}{d})=[n=1]=\varepsilon(n)μ∗1(n)=∑d∣n​μ(d)×1(dn​)=[n=1]=ε(n)

性质0x33.4证明:

由唯一分解定理: n=p1k1p2k2…pmkmn=p_1^{k_1}p_2^{k_2}\dots p_m^{k_m}n=p1k1​​p2k2​​…pmkm​​

代入上式得:
μ∗1(n)=∑d∣nμ(d)×1(nd)=∑C1=0k1∑C2=0k2⋯∑Cm=0kmμ(p1C1p2C2…pmCm)\begin{aligned}\mu*1(n)&=\sum_{d|n}\mu(d)\times 1(\cfrac{n}{d})\\&=\sum_{C_1=0}^{k_1}\sum_{C_2=0}^{k_2}\dots\sum_{C_m=0}^{k_m}\mu(p_1^{C_1}p_2^{C_2}\dots p_m^{C_m})\end{aligned}μ∗1(n)​=d∣n∑​μ(d)×1(dn​)=C1​=0∑k1​​C2​=0∑k2​​⋯Cm​=0∑km​​μ(p1C1​​p2C2​​…pmCm​​)​

我们分析该和式的实际意义,显然当某个质因子数量 ci>1c_i>1ci​>1,则 μ\muμ 的值为 000。
这样的话,我们就可以去掉无用的枚举(μ=0\mu=0μ=0),利用二项式定理证明:

μ∗1(n)=∑C1=01∑C2=01⋯∑Cm=01μ(p1C1p2C2…pmcm)=∑C1=01∑C2=01⋯∑Cm=01(−1)∑i=1mCi=∑i=0m(−1)i(mi)=[m=0]=[n=1]=ε(n)\begin{aligned}\mu*1(n)&=\sum_{C_1=0}^1\sum_{C_2=0}^1\dots\sum_{C_m=0}^1\mu(p_1^{C_1}p_2^{C_2}\dots p_m^{c_m}) \\&=\sum_{C_1=0}^1\sum_{C_2=0}^1\dots\sum_{C_m=0}^1(-1)^{\sum_{i=1}^m C_i}\\&=\sum_{i=0}^m(-1)^i\dbinom mi\\&=[m=0]=[n=1]=\varepsilon(n)\end{aligned}μ∗1(n)​=C1​=0∑1​C2​=0∑1​⋯Cm​=0∑1​μ(p1C1​​p2C2​​…pmcm​​)=C1​=0∑1​C2​=0∑1​⋯Cm​=0∑1​(−1)∑i=1m​Ci​=i=0∑m​(−1)i(im​)=[m=0]=[n=1]=ε(n)​

性质0x33.5:φ∗1(n)=∑d∣nφ(d)=n=id(n)\varphi*1(n)=\sum_{d|n}\varphi(d)=n=id(n)φ∗1(n)=∑d∣n​φ(d)=n=id(n)

性质0x33.5证明:

将 nnn 分解质因数:n=∏i=1kpici\displaystyle n=\prod_{i=1}^k {p_i}^{c_i}n=i=1∏k​pi​ci​

首先,因为 φ\varphiφ 是积性函数,故只要证明当 n′=pcn'=p^cn′=pc 时 φ∗1=∑d∣n′φ(n′d)=id⁡\displaystyle\varphi \ast 1=\sum_{d\mid n'}\varphi(\frac{n'}{d})=\operatorname{id}φ∗1=d∣n′∑​φ(dn′​)=id 成立即可。

因为 ppp 是质数,于是 d=p0,p1,p2,⋯,pcd=p^0,p^1,p^2,\cdots,p^cd=p0,p1,p2,⋯,pc

易知如下过程:

φ∗1=∑d∣nφ(nd)=∑i=0cφ(pi)=1+p0⋅(p−1)+p1⋅(p−1)+⋯+pc−1⋅(p−1)=pc=id⁡\begin{aligned} \varphi \ast 1&=\sum_{d\mid n}\varphi(\frac{n}{d})\\ &=\sum_{i=0}^c\varphi(p^i)\\ &=1+p^0\cdot(p-1)+p^1\cdot(p-1)+\cdots+p^{c-1}\cdot(p-1)\\ &=p^c\\ &=\operatorname{id}\\ \end{aligned} φ∗1​=d∣n∑​φ(dn​)=i=0∑c​φ(pi)=1+p0⋅(p−1)+p1⋅(p−1)+⋯+pc−1⋅(p−1)=pc=id​

该式子两侧同时卷 μ\muμ 可得 φ(n)=∑d∣nd⋅μ(nd)\displaystyle\varphi(n)=\sum_{d\mid n}d\cdot\mu(\frac{n}{d})φ(n)=d∣n∑​d⋅μ(dn​)
∵φ=μ∗id,ϵ=μ∗1∴1∗φ=1∗μ∗id∴1∗φ=ϵ∗id=id(n)∴∑d∣nφ(d)=n\begin{aligned}&∵\varphi = \mu * id,\epsilon = \mu * 1\\&∴1 * \varphi = 1 * \mu * id\\&∴1 * \varphi = \epsilon * id = id(n)\\&∴\sum_{d | n} \varphi (d) = n\end{aligned}​∵φ=μ∗id,ϵ=μ∗1∴1∗φ=1∗μ∗id∴1∗φ=ϵ∗id=id(n)∴d∣n∑​φ(d)=n​

积性函数的转换关系:

μ⇒∗1⇒ε⇒∗1⇒1⇒∗1⇒d\mu \Rightarrow^{*1}\Rightarrow \varepsilon\Rightarrow^{*1}\Rightarrow 1 \Rightarrow^{*1}\Rightarrow dμ⇒∗1⇒ε⇒∗1⇒1⇒∗1⇒d

φ⇒∗1⇒id⇒∗1⇒σ\varphi\Rightarrow^{*1}\Rightarrow id\Rightarrow^{*1}\Rightarrow \sigmaφ⇒∗1⇒id⇒∗1⇒σ

反方向的转换关系:

μ⇐∗μ⇐ε⇐∗μ⇐1⇐∗μ⇐d\mu\Leftarrow^{*\mu}\Leftarrow \varepsilon\Leftarrow^{*\mu}\Leftarrow 1\Leftarrow^{*\mu}\Leftarrow dμ⇐∗μ⇐ε⇐∗μ⇐1⇐∗μ⇐d

φ⇐∗μ⇐id⇐∗μ⇐σ\varphi\Leftarrow^{*\mu}\Leftarrow id\Leftarrow^{*\mu}\Leftarrow \sigmaφ⇐∗μ⇐id⇐∗μ⇐σ

0x33.2 O(nlogn)O(nlogn)O(nlogn) 的卷积预处理

若已知数论函数 f,gf, gf,g ,我么可以将枚举约数转换成枚举倍数,以调和级数 O(nlogn)O(nlogn)O(nlogn) 的复杂度求出 f∗gf∗gf∗g 的前 nnn 项 :

h(n)=f∗g(n)=∑d∣nf(d)g(nd)h(n)=f * g(n)=\sum_{d\ |\ n}f(d)g(\cfrac{n}{d})h(n)=f∗g(n)=d ∣ n∑​f(d)g(dn​)

推荐这个写法:

void Dirichlet(ll *f, ll *g)
{int h[N] = {0};for(int i = 1; i <= n; ++ i) {for(int j = i; j <= n; j += i) {h[j] = (h[j] + f[i] * g[j / i]) % mod;}}for(int i = 1; i <= n; ++ i) f[i] = h[i];
}

另一种写法:

int f[N], g[N], h[N];
inline void init(int n) {for (int i = 1; i * i <= n; i++) {for (int j = i; i * j <= n; j++) {if (j == i) h[i * j] += f[i] * g[i];else h[i * j] += f[i] * g[j] + f[j] * g[i];}}
}
  • 竞赛例题选讲

Problem A. Longge的问题 (P2303 [SDOI2012])

Problem
现在问题来了:给定一个整数 nnn,你需要求出 ∑i=1ngcd⁡(i,n)\displaystyle \sum\limits_{i=1}^n \gcd(i, n)i=1∑n​gcd(i,n),其中 gcd⁡(i,n)\gcd(i, n)gcd(i,n) 表示 iii 和 nnn 的最大公因数。

1≤n≤2321\leq n\leq 2^{32}1≤n≤232

Solution

设 gcd⁡(i,n)=d\gcd(i,n)=dgcd(i,n)=d,则 gcd⁡(id,nd)=1\gcd(\dfrac i d,\dfrac n d)=1gcd(di​,dn​)=1

ddd 显然就是 nnn 的因数

我们对于每个 ddd,要求有多少 iii 使得 gcd⁡(id,nd)=1\gcd(\dfrac i d,\dfrac n d)=1gcd(di​,dn​)=1 ,设求出有 xxx 个 iii,那么对答案的贡献就是 d×xd \times xd×x。为什么是这些贡献?很显然,这些 iii 与 nnn 的 gcd⁡\gcdgcd 就是 ddd,共 xxx 个这样的 iii,所以是 d×xd \times xd×x。

因为满足 gcd(id,nd)=1gcd(\dfrac i d,\dfrac n d)=1gcd(di​,dn​)=1 的 id\dfrac i ddi​ 的个数就是与 nd\dfrac n ddn​ 互质的数,每个 id\dfrac i ddi​ 又对应一个 iii ,个数就是φ(nd)φ(\dfrac n d)φ(dn​)。前面说了 ddd 是 nnn 的因数,我们枚举所有因数,累加 φ(nd)φ(\dfrac n d)φ(dn​) 即可。

对于每个 φ(nd)φ(\cfrac n d)φ(dn​),n\sqrt{n}n​ 求即可

当然利用欧拉反演可以直接得到一个一模一样的公式:

∑i=1ngcd⁡(i,n)=∑i=1n∑d∣i∑d∣nφ(d)=∑d∣n∑i=1n∑d∣iφ(d)=∑d∣n⌊nd⌋φ(d)\begin{aligned}\sum_{i=1}^n\gcd(i,n)&=\sum_{i=1}^n\sum_{d|i}\sum_{d|n}\varphi(d)\\&=\sum_{d|n}\sum_{i=1}^n\sum_{d|i}\varphi(d)\\&=\sum_{d|n}\left\lfloor\frac{n}{d}\right\rfloor\varphi(d)\end{aligned}i=1∑n​gcd(i,n)​=i=1∑n​d∣i∑​d∣n∑​φ(d)=d∣n∑​i=1∑n​d∣i∑​φ(d)=d∣n∑​⌊dn​⌋φ(d)​

Code

#include <bits/stdc++.h>using namespace std;
#define int long long
const int N = 50007;int n, m, t;
int ans;int get_phi(int n)
{int ans = n;for(int i = 2; i * i <= n; ++ i) {if(n % i == 0) {ans = ans / i * (i - 1);while(n % i == 0) n /= i;}}if(n > 1) ans = ans / n * (n - 1);return ans;
}signed main()
{scanf("%lld", &n);int ans = 0;for(int i = 1; i * i <= n; ++ i) {if(n % i == 0) {ans += n / i * get_phi(i);if(i * i != n) {ans += i * get_phi(n / i);}}}printf("%lld\n", ans);return 0;
}

Problem B. Clarke and math(HDU 5628 )

给定 f(i)f(i)f(i),(i=1,2,…,n)(i=1,2,…,n)(i=1,2,…,n)

求:

g(i)=∑i1∣i∑i2∣i1∑i3∣i2⋯∑ik∣ik−1f(ik)mod1000000007(1≤i≤n)\displaystyle g(i)=\sum_{i_1∣i}\sum_{i_2∣i_1}\sum_{i_3∣i_2}⋯\sum_{i_k∣i_{k-1}}f(i_k) \mod 1000000007(1≤i≤n)g(i)=i1​∣i∑​i2​∣i1​∑​i3​∣i2​∑​⋯ik​∣ik−1​∑​f(ik​)mod1000000007(1≤i≤n)

Solution

fff 和 ggg 进行一次Dirichlet卷积是 h(n)=f∗g(n)=∑d∣nf(d)g(nd)h(n)=f*g(n)=\sum_{d|n}f(d)g(\frac nd)h(n)=f∗g(n)=∑d∣n​f(d)g(dn​),显然可以发现题目中的式子实际上就是 f∗1kf*1^kf∗1k,其中 111 是不变函数,即 1(n)=11(n)=11(n)=1。使用快速幂加速即可。

Time

O(nlog2n)O(nlog^2n)O(nlog2n)

Code

// Problem: Clarke and math
// Contest: HDOJ
// URL: http://acm.hdu.edu.cn/showproblem.php?pid=5628
// Memory Limit: 65 MB
// Time Limit: 5000 ms
//
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>using namespace std;
using ll = long long;
const int N = 5e5 + 7, mod = 1e9 + 7;int n, m, k;
ll f[N], yi[N], res[N];void Dirichlet(ll *f, ll *g)
{int h[N] = {0};for(int i = 1; i <= n; ++ i) {for(int j = i; j <= n; j += i) {h[j] = (h[j] + f[i] * g[j / i]) % mod;}}for(int i = 1; i <= n; ++ i) f[i] = h[i];
}  void fpow(ll *res, ll *yi, int k)
{while(k) {if(k & 1) Dirichlet(res, yi);Dirichlet(yi, yi);k >>= 1;}
}void solve()
{scanf("%d%d", &n, &k);for(int i = 1; i <= n; ++ i) {scanf("%lld", &f[i]); res[i] = 0;yi[i] = 1;}   res[1] = 1;fpow(res, yi, k);   Dirichlet(f, res);for(int i = 1; i <= n; ++ i) {printf("%lld%s", f[i], i == n ? "\n" : " ");}
}int main()
{int t;scanf("%d", &t);while(t -- ) {solve();}return 0;
}

Problem C.


建议阅读的拓展内容:浅谈一类积性函数的前缀和

%https://blog.csdn.net/qq_37451344/article/details/81843722?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-13.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-13.control

%https://www.cnblogs.com/Milkor/p/4474835.html

%https://www.cnblogs.com/SuuT/p/11478313.html题单

《算法竞赛中的初等数论》(三)正文 0x30 积性函数(ACM / OI / MO)(十五万字符数论书)相关推荐

  1. 《算法竞赛中的初等数论》(一)正文 0x00整除、0x10 整除相关(ACM / OI / MO)(十五万字符数论书)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...

  2. 《算法竞赛中的初等数论》(五)正文 0x50筛法(ACM / OI / MO)(十五万字符数论书)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...

  3. 《算法竞赛中的初等数论》(四)正文 0x40反演(ACM / OI / MO)(十五万字符数论书)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...

  4. 《算法竞赛中的初等数论》(二)正文 0x20同余(ACM / OI / MO)(十五万字符数论书)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...

  5. 《算法竞赛中的初等数论》(六)正文 0x60 原根(ACM / OI / MO)(二十万字符数论书)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...

  6. 我的所有优质博客全部开源啦(我自己原创的《ACM模板》《算法全家桶》《算法竞赛中的初等数论》 PDF免费下载)

    你好呀ヾ(≧▽≦*)o 我是繁凡さん 这两年来我写了很多长篇文章,主要涉及数据结构,算法,程序设计竞赛,数学,计算几何等方面的内容: <数据结构>C语言版(清华严蔚敏考研版) 全书知识梳理 ...

  7. 【更新完毕】《算法竞赛中的初等数论》(ACM / OI / MO)前言、后记、目录索引(十五万字符的数论书)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 <算法竞赛中的初等数论>的全部内容的 Portable Document Format 版 ...

  8. 《算法设计编程实验:大学程序设计课程与竞赛训练教材》——3.3 积性函数的实验范例...

    3.3 积性函数的实验范例 首先,我们必须弄清楚什么是积性函数: 在非数论领域,积性函数是指所有对于任何a和b都有性质f(ab)=f(a)f(b)的函数. 在数论领域,考虑一个函数值为正整数的函数f, ...

  9. 成为计算几何master之路——记算法竞赛中常用的计几算法及思想

    文章目录 成为计算几何MASTER(FAKE)之路 1 引言 1.1 精度 1.2 剖分 1.3 层次化设计 2 点,向量和线 2.1 点积和叉积 2.2 线段(直线) 2.2.1 点在线段上判定 2 ...

最新文章

  1. halcon与QT联合:(5.4)瓶盖检测以及QT界面搭建
  2. 什么是离散的Hopfield网络?
  3. 干货!解读2016-2017全球人工智能技术及产业发展的现状及趋势~
  4. 3DSlicer24:Module-Create Scripted
  5. vivaldi浏览器_上网高阶用户怎么能少了这3个无广告、安全免费的浏览器呢
  6. CImageList类Create函数参数解析
  7. HDF5数据库和mysql数据库_哪些数据库比较适合实现数据实时入库的需求?
  8. php控制台脚本错误输出到php_errors.log
  9. linux如何查询一个文件夹大小,Linux下如何查看某个文件夹所占空间大小
  10. 安卓手机安装并使用自动化应用Tasker
  11. style文件的指定
  12. 命令行编译_[Bazel]自定义命令行编译标志
  13. hive sql 报错后继续执行_Hive迁移Presto在OPPO的实践
  14. idea 新建ssm java ee_IntelliJ IDEA基于SpringBoot如何搭建SSM开发环境的步骤详解
  15. 很遗憾,该服务器不支持 jmail 组件!,jmail组件注册以及权限设置问题
  16. 当积分墙揭开神秘面纱,还剩什么?
  17. 如何合并多个PDF文件并自动生成目录
  18. 编一程序,将两个字符串连接起来,不要用strcat函数.
  19. TCP可以从我们的视听感知中借鉴些什么
  20. 博客美化——页面白天黑夜切换

热门文章

  1. 优化你的CPU来做深度学习
  2. 用于数字成像的双三次插值技术​
  3. 第一篇:text preprocessing文本预处理
  4. python02-条件语句到循环语句
  5. SQL Sever 2008 R2 数据库(2) ——数据库管理
  6. 练习 MongoDB 操作 —— 分片篇(五)
  7. 搭建squid代理服务器
  8. 创建Material Design风格的Android应用--使用Drawable
  9. hadoop 提高hdfs删文件效率----hadoop删除文件流程解析
  10. 监控组策略应用---组策略建模