《算法竞赛中的初等数论》(三)正文 0x30 积性函数(ACM / OI / MO)(十五万字符数论书)
整理的算法模板合集: 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∣ndk
- σ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)={10n=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∏kpici,n′=i=1∏kpi
那么 ∑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∑kCki⋅(−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αkb=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βta×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)=d1d2d3=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(d1a),h(b)=d2∣b∑f(d2)g(d2b),
所以:
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(d1a)d2∣b∑f(d2)g(d2b)=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∣n1=d(n)
性质0x33.3:id∗1(n)=∑d∣nd=σ(n)id*1(n)=\sum_{d|n}d=\sigma(n)id∗1(n)=∑d∣nd=σ(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=p1k1p2k2…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∑k1C2=0∑k2⋯Cm=0∑kmμ(p1C1p2C2…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∑1C2=0∑1⋯Cm=0∑1μ(p1C1p2C2…pmcm)=C1=0∑1C2=0∑1⋯Cm=0∑1(−1)∑i=1mCi=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∏kpici
首先,因为 φ\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∑ngcd(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∑ngcd(i,n)=i=1∑nd∣i∑d∣n∑φ(d)=d∣n∑i=1∑nd∣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∣nf(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)(十五万字符数论书)相关推荐
- 《算法竞赛中的初等数论》(一)正文 0x00整除、0x10 整除相关(ACM / OI / MO)(十五万字符数论书)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...
- 《算法竞赛中的初等数论》(五)正文 0x50筛法(ACM / OI / MO)(十五万字符数论书)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...
- 《算法竞赛中的初等数论》(四)正文 0x40反演(ACM / OI / MO)(十五万字符数论书)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...
- 《算法竞赛中的初等数论》(二)正文 0x20同余(ACM / OI / MO)(十五万字符数论书)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...
- 《算法竞赛中的初等数论》(六)正文 0x60 原根(ACM / OI / MO)(二十万字符数论书)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...
- 我的所有优质博客全部开源啦(我自己原创的《ACM模板》《算法全家桶》《算法竞赛中的初等数论》 PDF免费下载)
你好呀ヾ(≧▽≦*)o 我是繁凡さん 这两年来我写了很多长篇文章,主要涉及数据结构,算法,程序设计竞赛,数学,计算几何等方面的内容: <数据结构>C语言版(清华严蔚敏考研版) 全书知识梳理 ...
- 【更新完毕】《算法竞赛中的初等数论》(ACM / OI / MO)前言、后记、目录索引(十五万字符的数论书)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 <算法竞赛中的初等数论>的全部内容的 Portable Document Format 版 ...
- 《算法设计编程实验:大学程序设计课程与竞赛训练教材》——3.3 积性函数的实验范例...
3.3 积性函数的实验范例 首先,我们必须弄清楚什么是积性函数: 在非数论领域,积性函数是指所有对于任何a和b都有性质f(ab)=f(a)f(b)的函数. 在数论领域,考虑一个函数值为正整数的函数f, ...
- 成为计算几何master之路——记算法竞赛中常用的计几算法及思想
文章目录 成为计算几何MASTER(FAKE)之路 1 引言 1.1 精度 1.2 剖分 1.3 层次化设计 2 点,向量和线 2.1 点积和叉积 2.2 线段(直线) 2.2.1 点在线段上判定 2 ...
最新文章
- halcon与QT联合:(5.4)瓶盖检测以及QT界面搭建
- 什么是离散的Hopfield网络?
- 干货!解读2016-2017全球人工智能技术及产业发展的现状及趋势~
- 3DSlicer24:Module-Create Scripted
- vivaldi浏览器_上网高阶用户怎么能少了这3个无广告、安全免费的浏览器呢
- CImageList类Create函数参数解析
- HDF5数据库和mysql数据库_哪些数据库比较适合实现数据实时入库的需求?
- php控制台脚本错误输出到php_errors.log
- linux如何查询一个文件夹大小,Linux下如何查看某个文件夹所占空间大小
- 安卓手机安装并使用自动化应用Tasker
- style文件的指定
- 命令行编译_[Bazel]自定义命令行编译标志
- hive sql 报错后继续执行_Hive迁移Presto在OPPO的实践
- idea 新建ssm java ee_IntelliJ IDEA基于SpringBoot如何搭建SSM开发环境的步骤详解
- 很遗憾,该服务器不支持 jmail 组件!,jmail组件注册以及权限设置问题
- 当积分墙揭开神秘面纱,还剩什么?
- 如何合并多个PDF文件并自动生成目录
- 编一程序,将两个字符串连接起来,不要用strcat函数.
- TCP可以从我们的视听感知中借鉴些什么
- 博客美化——页面白天黑夜切换