上一篇:莫比乌斯反演(0)

文章目录

  • 莫比乌斯反演
    • 关于反演
    • 莫比乌斯函数
      • 定义
      • 性质
    • 莫比乌斯反演公式
      • 公式1
      • 公式2
    • 整除分块
      • 引入
      • 关于整除分块
      • 基础推导
      • 简单扩展
    • 莫比乌斯反演的应用
      • 例1:证明下式成立
      • 例2:YY的GCD
      • 例3:Problem b
      • 例4:完全平方数
      • 例5:约数个数和
    • 总结

莫比乌斯反演

正片开始

关于反演

顾名思义,反演就是反向演变,举个栗子,若有F(n)=k⋅f(n)F(n)=k\cdot f(n)F(n)=k⋅f(n),我们能够推出f(n)=F(n)kf(n)=\dfrac {F(n)} kf(n)=kF(n)​,这就是反演。

莫比乌斯函数

定义

μ(n)={1n=1(−1)kn=p1p2…pk(pi∈P)0p2∣n(p∈P)\mu(n)=\begin{cases}1&n=1\\(-1)^k&n=p_1p_2\dots p_k(p_i\in P)\\0&p^2|n(p\in P)\end{cases}μ(n)=⎩⎨⎧​1(−1)k0​n=1n=p1​p2​…pk​(pi​∈P)p2∣n(p∈P)​

性质

∑d∣nμ(d)=[n=1]\sum\limits_{d|n}\mu(d)=[n=1]d∣n∑​μ(d)=[n=1]
证明:
当n=1n=1n=1时显然。
考虑μ(d)\mu(d)μ(d)的贡献。
只有当ddd中的质因子都只出现一次时,μ(d)\mu(d)μ(d)才对和式有贡献。
问题变成了在nnn的质因子中选择kkk个,kkk为奇数则贡献为−1-1−1,kkk为偶数则贡献为111.
设nnn中有mmm种不同的质因子。
∑d∣nμ(d)=∑j=0m(−1)j(mj)\sum\limits_{d|n}\mu(d)=\sum\limits_{j=0}^m(-1)^j\begin{pmatrix}m\\j\end{pmatrix}d∣n∑​μ(d)=j=0∑m​(−1)j(mj​)
(mj)\begin{pmatrix}m\\j\end{pmatrix}(mj​)表示在mmm个不同的数中选取jjj个数的方案数,等价于CmjC^j_mCmj​.
根据二项式定理(x+y)n=∑i=0n(ni)xiyn−i(x+y)^n=\sum\limits_{i=0}^n\begin{pmatrix}n\\i\end{pmatrix}x^iy^{n-i}(x+y)n=i=0∑n​(ni​)xiyn−i,我们令x=−1,y=1x=-1,y=1x=−1,y=1,就可以发现右边的和式等于∑j=0m(−1)j(mj)\sum\limits_{j=0}^m(-1)^j\begin{pmatrix}m\\j\end{pmatrix}j=0∑m​(−1)j(mj​),所以有
∑d∣nμ(d)=∑j=0m(−1)j(mj)=(1−1)m=0\sum\limits_{d|n}\mu(d)=\sum\limits_{j=0}^m(-1)^j\begin{pmatrix}m\\j\end{pmatrix}=(1-1)^m=0d∣n∑​μ(d)=j=0∑m​(−1)j(mj​)=(1−1)m=0
得证。

这就是说,当n=1n=1n=1时∑d∣nμ(d)=1\sum\limits_{d|n}\mu(d)=1d∣n∑​μ(d)=1,否则∑d∣nμ(d)=0\sum\limits_{d|n}\mu(d)=0d∣n∑​μ(d)=0.

莫比乌斯反演公式

公式1

若F(n)=∑d∣nf(d)F(n)=\sum\limits_{d|n}f(d)F(n)=d∣n∑​f(d),则f(n)=∑d∣nμ(d)F(nd)f(n)=\sum\limits_{d|n}\mu(d)F(\dfrac n d)f(n)=d∣n∑​μ(d)F(dn​)
证明:
∑d∣nμ(d)F(nd)=∑d∣nμ(d)∑p∣ndf(p)\sum\limits_{d|n}\mu(d)F(\dfrac n d)=\sum\limits_{d|n}\mu(d)\sum\limits_{p|\frac n d}f(p)d∣n∑​μ(d)F(dn​)=d∣n∑​μ(d)p∣dn​∑​f(p)
注意此时的运算顺序是∑d∣n(μ(d)∑p∣ndf(p))\sum\limits_{d|n}(\mu(d)\sum\limits_{p|\frac n d}f(p))d∣n∑​(μ(d)p∣dn​∑​f(p))
这时候,我们可以手玩这个式子,来寻找规律。
我们让n=6n=6n=6.
∑d∣nμ(d)∑p∣ndf(p)=∑d∣6μ(d)∑p∣6df(p)=μ(1)×(f(1)+f(2)+f(3)+f(6))+μ(2)×(f(1)+f(3))+μ(3)×(f(1)+f(2))+μ(6)×f(1)=f(1)×(μ(1)+μ(2)+μ(3)+μ(6))+f(2)×(μ(1)+μ(3))+f(3)×(μ(1)+μ(2))+f(6)×μ(1)=∑d∣6f(d)∑p∣6dμ(p)=∑d∣nf(d)∑p∣ndμ(p)\sum\limits_{d|n}\mu(d)\sum\limits_{p|\frac n d}f(p)\\=\sum\limits_{d|6}\mu(d)\sum\limits_{p|\frac 6 d}f(p)\\=\mu(1)\times (f(1)+f(2)+f(3)+f(6))\\\space+\mu(2)\times (f(1)+f(3))\\\space+\mu(3)\times (f(1)+f(2))\\\space+\mu(6)\times f(1)\\=f(1)\times (\mu(1)+\mu(2)+\mu(3)+\mu(6))\\\space+f(2)\times (\mu(1)+\mu(3))\\\space+f(3)\times (\mu(1)+\mu(2))\\\space +f(6)\times \mu(1)\\=\sum\limits_{d|6}f(d)\sum\limits_{p|{\frac 6 d}}\mu(p)\\=\sum\limits_{d|n}f(d)\sum\limits_{p|{\frac n d}}\mu(p)d∣n∑​μ(d)p∣dn​∑​f(p)=d∣6∑​μ(d)p∣d6​∑​f(p)=μ(1)×(f(1)+f(2)+f(3)+f(6)) +μ(2)×(f(1)+f(3)) +μ(3)×(f(1)+f(2)) +μ(6)×f(1)=f(1)×(μ(1)+μ(2)+μ(3)+μ(6)) +f(2)×(μ(1)+μ(3)) +f(3)×(μ(1)+μ(2)) +f(6)×μ(1)=d∣6∑​f(d)p∣d6​∑​μ(p)=d∣n∑​f(d)p∣dn​∑​μ(p)
感性证明

这貌似不是巧合,其中肯定有什么规律。
思考为什么有∑d∣nμ(d)∑p∣ndf(p)=∑p∣nf(p)∑d∣npμ(d)\sum\limits_{d|n}\mu(d)\sum\limits_{p|\frac n d}f(p)=\sum\limits_{p|n}f(p)\sum\limits_{d|{\frac n p}}\mu(d)d∣n∑​μ(d)p∣dn​∑​f(p)=p∣n∑​f(p)d∣pn​∑​μ(d)
观察原式的枚举变量,容易发现pd∣npd|npd∣n,且p∣n,d∣np|n,d|np∣n,d∣n
原式可以理解为枚举μ(d)\mu(d)μ(d),计算出现了多少个μ(d)\mu(d)μ(d)
而转化后的式子是枚举f(p)f(p)f(p),计算出现了多少个f(p)f(p)f(p)
那么有哪些μ\muμ值对f(p)f(p)f(p)有贡献呢?
换句话说,哪些μ\muμ值的和才是f(p)f(p)f(p)的系数呢?
因为pd∣npd|npd∣n,所以d∣npd|\dfrac n pd∣pn​. 满足这条性质的μ(d)\mu(d)μ(d)值之和就是f(p)f(p)f(p)的系数。
于是完成证明∑d∣nμ(d)F(nd)=∑p∣nf(p)∑d∣npμ(d)\sum\limits_{d|n}\mu(d)F(\dfrac n d)=\sum\limits_{p|n}f(p)\sum\limits_{d|{\frac n p}}\mu(d)d∣n∑​μ(d)F(dn​)=p∣n∑​f(p)d∣pn​∑​μ(d)
根据莫比乌斯函数的性质,只有当np=1\dfrac n p=1pn​=1时,f(p)∑d∣npμ(d)f(p)\sum\limits_{d|{\frac n p}}\mu(d)f(p)d∣pn​∑​μ(d) 才不为000,因为∑d∣npμ(d)=[np=1]\sum\limits_{d|{\frac n p}}\mu(d)=[\dfrac n p=1]d∣pn​∑​μ(d)=[pn​=1].
此时n=pn=pn=p.
也就是只有在p=np=np=n时才会对∑p∣nf(p)∑d∣npμ(d)\sum\limits_{p|n}f(p)\sum\limits_{d|{\frac n p}}\mu(d)p∣n∑​f(p)d∣pn​∑​μ(d)这个式子产生贡献。
所以∑p∣nf(p)∑d∣npμ(d)=f(n)\sum\limits_{p|n}f(p)\sum\limits_{d|{\frac n p}}\mu(d)=f(n)p∣n∑​f(p)d∣pn​∑​μ(d)=f(n).
于是得证。

公式2

若F(n)=∑n∣df(d)F(n)=\sum\limits_{n|d}f(d)F(n)=n∣d∑​f(d),则f(n)=∑n∣dμ(dn)F(d)f(n)=\sum\limits_{n|d}\mu(\dfrac d n)F(d)f(n)=n∣d∑​μ(nd​)F(d)
证明:
思路同上,稍复杂。
∑n∣dμ(dn)F(d)=∑n∣dμ(dn)∑d∣pf(p)\sum\limits_{n|d}\mu(\dfrac d n)F(d)=\sum\limits_{n|d}\mu(\dfrac d n)\sum\limits_{d|p}f(p)n∣d∑​μ(nd​)F(d)=n∣d∑​μ(nd​)d∣p∑​f(p)
仍然可以手玩n=6n=6n=6的栗子,需要注意的是这里的项数有无限个。
手玩过程略,以下是理论简单证明。
已知n∣d∣pn|d|pn∣d∣p,设d=knd=knd=kn,显然kn∣pkn|pkn∣p.
∑n∣dμ(dn)∑d∣pf(p)=∑k=1∞μ(k)∑kn∣pf(p)\sum\limits_{n|d}\mu(\dfrac d n)\sum\limits_{d|p}f(p)=\sum\limits_{k=1}^\infin\mu(k)\sum\limits_{kn|p}f(p)n∣d∑​μ(nd​)d∣p∑​f(p)=k=1∑∞​μ(k)kn∣p∑​f(p)
考虑f(p)f(p)f(p)的系数。
因为kn∣pkn|pkn∣p,所以k∣pnk|\dfrac p nk∣np​.
所以∑k=1∞μ(k)∑kn∣pf(p)=∑n∣pf(p)∑d∣pnμ(d)\sum\limits_{k=1}^\infin\mu(k)\sum\limits_{kn|p}f(p)=\sum\limits_{n|p}f(p)\sum\limits_{d|\frac p n}\mu(d)k=1∑∞​μ(k)kn∣p∑​f(p)=n∣p∑​f(p)d∣np​∑​μ(d)
对∑d∣pnμ(d)\sum\limits_{d|\frac p n}\mu(d)d∣np​∑​μ(d)的讨论同上,最终得出∑n∣pf(p)∑d∣pnμ(d)=f(n)\sum\limits_{n|p}f(p)\sum\limits_{d|\frac p n}\mu(d)=f(n)n∣p∑​f(p)d∣np​∑​μ(d)=f(n)
得证。

整除分块

引入

先看一个问题:求∑i=1n⌊ni⌋\sum\limits_{i=1}^n\lfloor\dfrac n i\rfloori=1∑n​⌊in​⌋的值,1≤n≤10121\le n\le 10^{12}1≤n≤1012.
暴力显然,时间复杂度为O(n)O(n)O(n),无法通过这题。

关于整除分块

整除分块,又称数论分块,能够在O(n)O(\sqrt n)O(n​)的时间复杂度内解决引入中的问题。

其原理是不同的数做整除运算时可能有相同的结果,利用这一点合理分块,大大降低时间复杂度。
对一个整除和式分成多个块,故称整除分块。

只可用于整除式。

学习整除分块,是因为莫比乌斯反演中很多和式最后都会带有整除和式,运用整除分块就可以非常快速地求出整除和式的值。

这篇博客的整除分块写得很好,是我见过最详细的整除分块。

基础推导

首先观察下表。

x 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
y=⌊20x⌋y=\lfloor\dfrac {20} x\rfloory=⌊x20​⌋ 20 10 6 5 4 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1

显然,y=⌊nx⌋y=\lfloor\dfrac n x\rfloory=⌊xn​⌋的函数值是单调递减的,⌊nx⌋\lfloor\dfrac n x\rfloor⌊xn​⌋相同的xxx一定是连续的。
举个栗子,上表中y=⌊20x⌋y=\lfloor\dfrac {20} x\rfloory=⌊x20​⌋的值为222的xxx是777到101010这一连续段。
对于上表,计算∑x=120⌊20x⌋\sum\limits_{x=1}^{20}\lfloor\dfrac {20} x\rfloorx=1∑20​⌊x20​⌋的值,除了可以暴力计算外,还可以20×1+10×1+6×1+5×1+4×1+3×1+2×4+1×1020\times 1+10\times 1+6\times 1+5\times 1+4\times 1+3\times 1+2\times 4+1\times 1020×1+10×1+6×1+5×1+4×1+3×1+2×4+1×10.
这就是整除分块的基本思想,把⌊nx⌋\lfloor\dfrac n x\rfloor⌊xn​⌋值相同的xxx分成一块,用块长乘块值得到这个块的贡献。
那么为什么其时间复杂度为O(n)O(\sqrt n)O(n​)呢?
我们要充分发挥数形结合的数学思想,就可以巧妙地不严谨证明了。
观察下图,这是y=10xy=\dfrac {10} xy=x10​的函数图像,CCC点为(10,10)(\sqrt {10},\sqrt{10})(10​,10​)。
显然,这个函数图像关于直线y=xy=xy=x对称。
那么在CCC点左侧,有n\sqrt nn​个整数xxx,那么最多有n\sqrt nn​个整点。
那么将函数图像沿直线y=xy=xy=x翻折,得到CCC点右侧也最多有n\sqrt nn​个整点。显然,CCC点右侧的整点的纵坐标yyy值只有n\sqrt nn​个取值。
所以总共最多有2n2\sqrt n2n​个整点,分块后计算的时间复杂度为O(n)O(\sqrt n)O(n​).

那么我们如何计算块长乘块值呢?
假设我们知道一个块的左端点lll,显然块值k=⌊nl⌋k=\lfloor\dfrac n l\rfloork=⌊ln​⌋.
如何求右端点rrr?
可以发现,块内的值iii满足ik≤nik\le nik≤n,即i≤⌊nk⌋i\le \lfloor\dfrac n k\rfloori≤⌊kn​⌋,rrr就是iii的最大值,即r=⌊nk⌋r=\lfloor\dfrac n k\rfloorr=⌊kn​⌋。
因为k=⌊nl⌋k=\lfloor\dfrac n l\rfloork=⌊ln​⌋,所以r=⌊nk⌋=⌊n⌊nl⌋⌋r=\lfloor\dfrac n k\rfloor=\left\lfloor{\dfrac n {\lfloor\dfrac n l\rfloor}}\right\rfloorr=⌊kn​⌋=​⌊ln​⌋n​​
这就是最基础的整除分块。

简单扩展


∑i=1min(n,m)⌊ni⌋⌊mi⌋\sum\limits_{i=1}^{min(n,m)}\lfloor\dfrac n i\rfloor\lfloor\dfrac m i\rfloori=1∑min(n,m)​⌊in​⌋⌊im​⌋
这个式子很重要,很多莫反的题目最后都包含这个式子。
其实非常简单,对于这个式子,仍然有⌊ni⌋\lfloor\dfrac n i\rfloor⌊in​⌋和⌊mi⌋\lfloor\dfrac m i\rfloor⌊im​⌋的值都分别相等的一段xxx.
不懂的话像上面一样列表即可发现。
一个块的右端点就是对⌊ni⌋\lfloor\dfrac n i\rfloor⌊in​⌋整除分块的右端点和对⌊mi⌋\lfloor\dfrac m i\rfloor⌊im​⌋整除分块的右端点的较小值。
具体见代码。

for(int i = 1; i <= min(n, m);) {int l = i, r = min(n / (n / i), m / (m / i));ans += 1ll * (n / l) * (m / l) * (r - l + 1), i = r + 1;
}

更多关于整除分块的探讨在上文提到的文章中有写到。

莫比乌斯反演的应用

例1:证明下式成立

∑d∣nμ(d)nd=ϕ(n)\sum\limits_{d|n}\mu(d)\dfrac n d=\phi(n)d∣n∑​μ(d)dn​=ϕ(n)
证明:

F(n)=n,f(n)=ϕ(n)F(n)=n,f(n)=\phi(n)F(n)=n,f(n)=ϕ(n)
因为n=∑d∣nϕ(d)n=\sum\limits_{d|n}\phi(d)n=d∣n∑​ϕ(d),所以F(n)=∑d∣nf(d)F(n)=\sum\limits_{d|n}f(d)F(n)=d∣n∑​f(d).
使用公式1反演f(n)f(n)f(n),得
ϕ(n)=f(n)=∑d∣nμ(d)F(nd)=∑d∣nμ(d)nd\phi(n)=f(n)=\sum\limits_{d|n}\mu(d)F(\dfrac n d)=\sum\limits_{d|n}\mu(d)\dfrac n dϕ(n)=f(n)=d∣n∑​μ(d)F(dn​)=d∣n∑​μ(d)dn​

例2:YY的GCD

题目
题目大意:给定n,m(1≤n,m≤107)n,m(1\le n,m\le 10^7)n,m(1≤n,m≤107),求∑i=1n∑j=1m[(i,j)∈P]\sum\limits_{i=1}^n\sum\limits_{j=1}^m[(i,j)\in P]i=1∑n​j=1∑m​[(i,j)∈P],有C(1≤T≤104)C(1\le T\le 10^4)C(1≤T≤104)次询问。
设f(p)f(p)f(p)为二元组(x,y)(x,y)(x,y)在各自的值域范围内满足(x,y)=p(x,y)=p(x,y)=p的二元组数量,即f(p)=∑i=1n∑j=1m[(x,y)=p]f(p)=\sum\limits_{i=1}^n\sum\limits_{j=1}^m[(x,y)=p]f(p)=i=1∑n​j=1∑m​[(x,y)=p]
设F(p)F(p)F(p)为二元组(x,y)(x,y)(x,y)在各自的值域范围内满足p∣(x,y)p|(x,y)p∣(x,y)的二元组数量,即F(p)=∑i=1n∑j=1m[p∣(x,y)]F(p)=\sum\limits_{i=1}^n\sum\limits_{j=1}^m[p|(x,y)]F(p)=i=1∑n​j=1∑m​[p∣(x,y)]
设PPP为区间[1,min(n,m)][1,min(n,m)][1,min(n,m)]内的质数集合。

F(p)=∑p∣df(d)F(p)=\sum\limits_{p|d}f(d)F(p)=p∣d∑​f(d),所以f(p)=∑p∣dμ(dp)F(d)f(p)=\sum\limits_{p|d}\mu(\dfrac d p)F(d)f(p)=p∣d∑​μ(pd​)F(d)
F(1)=∑p≤nf(p)F(1)=\sum\limits_{p\le n}f(p)F(1)=p≤n∑​f(p),f(1)=∑d=1∞μ(d)F(d)f(1)=\sum\limits_{d=1}^\infin\mu(d)F(d)f(1)=d=1∑∞​μ(d)F(d)

答案就是
∑p∈P,x≤n,y≤mf(p)\sum\limits_{p\in P,x\le n,y\le m}f(p)p∈P,x≤n,y≤m∑​f(p)
因为(x,y)=p(x,y)=p(x,y)=p,所以计算x≤⌊np⌋,y≤⌊mp⌋x\le \lfloor\dfrac n p \rfloor,y\le \lfloor \dfrac m p \rfloorx≤⌊pn​⌋,y≤⌊pm​⌋范围内(x,y)=1(x,y)=1(x,y)=1的值与原式的值等价。
∑p∈P,x≤n,y≤mf(p)=∑p∈P,x≤np,y≤mpf(1)=∑p∈P,x≤np,y≤mp,1∣dF(d)μ(d)\sum\limits_{p\in P,x\le n,y\le m}f(p)\\=\sum\limits_{p\in P,x\le \frac n p,y\le \frac m p}f(1)\\=\sum\limits_{p\in P,x\le \frac n p,y\le \frac m p,1|d}F(d)\mu(d)p∈P,x≤n,y≤m∑​f(p)=p∈P,x≤pn​,y≤pm​∑​f(1)=p∈P,x≤pn​,y≤pm​,1∣d∑​F(d)μ(d)
推导F(p)=∑i=1n∑j=1m[p∣(x,y)]=∑i=1⌊np⌋∑j=1⌊mp⌋[1∣(x,y)]=⌊np⌋×⌊mp⌋F(p)=\sum\limits_{i=1}^n\sum\limits_{j=1}^m[p|(x,y)]=\sum\limits_{i=1}^{\lfloor\frac n p\rfloor}\sum\limits_{j=1}^{\lfloor\frac m p\rfloor}[1|(x,y)]=\lfloor\frac n p\rfloor\times \lfloor\frac m p\rfloorF(p)=i=1∑n​j=1∑m​[p∣(x,y)]=i=1∑⌊pn​⌋​j=1∑⌊pm​⌋​[1∣(x,y)]=⌊pn​⌋×⌊pm​⌋,注意这里的x,yx,yx,y取值分别是n,mn,mn,m之内。
所以
∑p∈P,x≤np,y≤mp,1∣dF(d)μ(d)=∑p∈P,x≤np,y≤mp,1∣dμ(d)⌊npd⌋×⌊mpd⌋\sum\limits_{p\in P,x\le \frac n p,y\le \frac m p,1|d}F(d)\mu(d)=\sum\limits_{p\in P,x\le \frac n p,y\le \frac m p,1|d}\mu(d)\lfloor\dfrac n {pd}\rfloor\times \lfloor\dfrac m {pd}\rfloorp∈P,x≤pn​,y≤pm​,1∣d∑​F(d)μ(d)=p∈P,x≤pn​,y≤pm​,1∣d∑​μ(d)⌊pdn​⌋×⌊pdm​⌋
这里nnn要多除以一个ppp的原因是F(d)F(d)F(d)中的二元组(x,y)(x,y)(x,y)的范围是⌊np⌋,⌊mp⌋\lfloor\frac n p\rfloor,\lfloor\frac m p\rfloor⌊pn​⌋,⌊pm​⌋.
令T=pdT=pdT=pd,则
∑p∈P,x≤np,y≤mp,1∣dμ(d)⌊npd⌋×⌊mpd⌋=∑p∈P,T≤min(n,m)μ(Tp)⌊nT⌋⌊mT⌋\sum\limits_{p\in P,x\le \frac n p,y\le \frac m p,1|d}\mu(d)\lfloor\dfrac n {pd}\rfloor\times \lfloor\dfrac m {pd}\rfloor=\sum\limits_{p\in P,T\le min(n,m)}\mu(\dfrac T p)\lfloor\dfrac n T\rfloor\lfloor\dfrac m T\rfloorp∈P,x≤pn​,y≤pm​,1∣d∑​μ(d)⌊pdn​⌋×⌊pdm​⌋=p∈P,T≤min(n,m)∑​μ(pT​)⌊Tn​⌋⌊Tm​⌋
考虑对于⌊nT⌋⌊mT⌋\lfloor\dfrac n T\rfloor\lfloor\dfrac m T\rfloor⌊Tn​⌋⌊Tm​⌋求其系数,容易发现系数为∑p∣Tμ(Tp)\sum\limits_{p|T}\mu(\dfrac T p)p∣T∑​μ(pT​)

∑p∈P,T≤min(n,m)μ(Tp)⌊nT⌋⌊mT⌋=∑T≤min(n,m)⌊nT⌋⌊mT⌋∑p∣Tμ(Tp)\sum\limits_{p\in P,T\le min(n,m)}\mu(\dfrac T p)\lfloor\dfrac n T\rfloor\lfloor\dfrac m T\rfloor=\sum\limits_{T\le min(n,m)}\lfloor\dfrac n T\rfloor\lfloor\dfrac m T\rfloor\sum\limits_{p|T}\mu(\dfrac T p)p∈P,T≤min(n,m)∑​μ(pT​)⌊Tn​⌋⌊Tm​⌋=T≤min(n,m)∑​⌊Tn​⌋⌊Tm​⌋p∣T∑​μ(pT​)
对于⌊nT⌋⌊mT⌋\lfloor\dfrac n T\rfloor\lfloor\dfrac m T\rfloor⌊Tn​⌋⌊Tm​⌋,可以用整除分块,对于后面的∑p∣Tμ(Tp)\sum\limits_{p|T}\mu(\dfrac T p)p∣T∑​μ(pT​)可以预处理出前缀和来计算。
首先线性筛出所有μ\muμ函数的值,然后枚举质数ppp,再枚举其倍数Tp\dfrac T ppT​,将μ(Tp)\mu(\dfrac T p)μ(pT​)的值累加到sum[T]sum[T]sum[T]中。
这样计算看起来很慢,但其实是很快的。
这样计算的时间复杂度为∑p∣T(Tp)=T∑p∣T1p<T∑x=1T1x<Tln⁡T\sum\limits_{p|T}(\dfrac T p)=T\sum\limits_{p|T}\dfrac 1 p<T\sum\limits_{x=1}^T\dfrac 1 x<T\ln Tp∣T∑​(pT​)=Tp∣T∑​p1​<Tx=1∑T​x1​<TlnT
所以每个质数均摊的时间复杂度为O(ln⁡T)O(\ln T)O(lnT),而质数个数有Tln⁡T\dfrac T {\ln T}lnTT​个,所以预处理的时间复杂度为O(T)O(T)O(T)
通过整除分块,每组数据可以在O(n)O(\sqrt n)O(n​)的时间复杂度内计算,所以总的时间复杂度为O(Cn)O(C\sqrt n)O(Cn​)

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 10000005;
int T, n, m, mu[N], smu[N], vis[N], pri[N], cnt = 0;
void getmu() {mu[1] = 1;for (int i = 2; i < N; i++) {if (!vis[i]) pri[++cnt] = i, mu[i] = -1;for (int j = 1; j <= cnt && i * pri[j] < N; j++) {vis[i * pri[j]] = 1;if (i % pri[j] == 0) break;mu[i * pri[j]] = -mu[i];}}
}
void getsmu() {for (int i = 1; i <= cnt; i++)for (int j = 1; pri[i] * j < N; j++)smu[pri[i] * j] += mu[j];for (int i = 2; i < N; i++) smu[i] += smu[i - 1];
}
int main() {scanf("%d", &T);getmu(), getsmu();while (T--) {scanf("%d%d", &n, &m);LL ans = 0;for (int i = 1; i <= min(n, m);) {int l = i, r = min(n / (n / i), m / (m / i));ans += 1ll * (smu[r] - smu[l - 1]) * (n / l) * (m / l), i = r + 1;}printf("%lld\n", ans);}return 0;
}
例3:Problem b

题目
题目大意:对于给定的a,b,c,d,ka,b,c,d,ka,b,c,d,k,求∑x=ab∑y=cd[(x,y)=k]\sum\limits_{x=a}^b\sum\limits_{y=c}^d[(x,y)=k]x=a∑b​y=c∑d​[(x,y)=k]. 有NNN次询问。

设fn,m(k)=∑x=1n∑y=1m[(x,y)=k]Fn,m(k)=∑x=1n∑y=1m[k∣(x,y)]f_{n,m}(k)=\sum\limits_{x=1}^n\sum\limits_{y=1}^m[(x,y)=k]\\F_{n,m}(k)=\sum\limits_{x=1}^n\sum\limits_{y=1}^m[k|(x,y)]fn,m​(k)=x=1∑n​y=1∑m​[(x,y)=k]Fn,m​(k)=x=1∑n​y=1∑m​[k∣(x,y)]
有FA,B(k)=∑k∣nfA,B(n)F_{A,B}(k)=\sum\limits_{k|n}f_{A,B}(n)FA,B​(k)=k∣n∑​fA,B​(n)
则答案为fb,d(k)−fa−1,d(k)−fb,c−1(k)+fa−1,c−1(k)f_{b,d}(k)-f_{a-1,d}(k)-f_{b,c-1}(k)+f_{a-1,c-1}(k)fb,d​(k)−fa−1,d​(k)−fb,c−1​(k)+fa−1,c−1​(k),类似于二维前缀和的容斥。

Fn,m(k)F_{n,m}(k)Fn,m​(k)是很好求的,它等于⌊nk⌋⌊mk⌋\lfloor \dfrac n k\rfloor\lfloor \dfrac m k\rfloor⌊kn​⌋⌊km​⌋.

这是因为在nnn内有⌊nk⌋\lfloor \dfrac n k\rfloor⌊kn​⌋个数包含因子kkk,同理,在mmm内有⌊mk⌋\lfloor \dfrac m k\rfloor⌊km​⌋个数包含因子kkk.

根据乘法原理,有⌊nk⌋⌊mk⌋\lfloor \dfrac n k\rfloor\lfloor \dfrac m k\rfloor⌊kn​⌋⌊km​⌋对二元组(x,y)(x,y)(x,y)满足k∣gcd(x,y)k|gcd(x,y)k∣gcd(x,y).

运用莫反,有f(n)A,B=∑n∣kμ(kn)FA,B(k)=∑n∣kμ(kn)⌊Ak⌋⌊Bk⌋f(n)_{A,B}=\sum\limits_{n|k}\mu(\dfrac k n)F_{A,B}(k)=\sum\limits_{n|k}\mu(\dfrac k n)\lfloor \dfrac A k\rfloor\lfloor \dfrac B k\rfloorf(n)A,B​=n∣k∑​μ(nk​)FA,B​(k)=n∣k∑​μ(nk​)⌊kA​⌋⌊kB​⌋
令T=knT=\dfrac k nT=nk​,有
f(n)A,B=∑n∣kμ(kn)⌊Ak⌋⌊Bk⌋=∑T=1min(A,B)μ(T)⌊ATn⌋⌊BTn⌋f(n)_{A,B}=\sum\limits_{n|k}\mu(\dfrac k n)\lfloor \dfrac A k\rfloor\lfloor \dfrac B k\rfloor=\sum\limits_{T=1}^{min(A,B)}\mu(T)\lfloor \dfrac A {Tn}\rfloor\lfloor \dfrac B {Tn}\rfloorf(n)A,B​=n∣k∑​μ(nk​)⌊kA​⌋⌊kB​⌋=T=1∑min(A,B)​μ(T)⌊TnA​⌋⌊TnB​⌋

运用整除分块+预处理,时间复杂度可以做到O(Nn)O(N\sqrt n)O(Nn​),nnn最大为5×1045\times 10^45×104.

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 50005;
int T, a, b, c, d, k, vis[N], pri[N], cnt = 0, mu[N], sum[N];
void getmu() {mu[1] = 1;for (int i = 2; i < N; i++) {if (!vis[i]) pri[++cnt] = i, mu[i] = -1;for (int j = 1; j <= cnt && i * pri[j] < N; j++) {vis[i * pri[j]] = 1;if (i % pri[j] == 0) break;mu[i * pri[j]] = -mu[i];}}for (int i = 1; i < N; i++) sum[i] = sum[i - 1] + mu[i];
}
LL getans(int x, int y) {LL s = 0;for (int i = 1; i <= min(x, y);) {LL l = i, r = min(x / (x / i), y / (y / i));s += 1ll * (sum[r] - sum[l - 1]) * (x / (l * k)) * (y / (l * k)), i = r + 1;}return s;
}
int main() {scanf("%d", &T);getmu();while (T--) scanf("%d%d%d%d%d", &a, &b, &c, &d, &k), printf("%lld\n", getans(b, d) - getans(b, c - 1) - getans(a - 1, d) + getans(a - 1, c - 1));return 0;
}
例4:完全平方数

题目
题目大意:正整数集合中,若一个数是平方数(111 除外)的正整数倍,称这个数为坏的数,否则为好的数。求第K(1≤K≤109)K(1\le K\le 10^9)K(1≤K≤109)个好的数。有T(1≤T≤50)T(1\le T\le 50)T(1≤T≤50)次询问。

这题实际上是莫比乌斯函数的巧妙运用。

如果我们知道[1,n][1,n][1,n]内有多少个好的数,就可以用二分解决。
考虑如何求[1,n][1,n][1,n]内有多少个好的数。
好的数不好直接求,转化为nnn减去坏的数的数量。
在区间[1,n][1,n][1,n]内有⌊n4⌋\lfloor\dfrac n 4\rfloor⌊4n​⌋个数为22=42^2=422=4的倍数,那当然不需要计算⌊n16⌋\lfloor\dfrac n {16}\rfloor⌊16n​⌋的倍数。
所以只需要计算质数的倍数即可。
从而想到容斥。
从总数nnn中删去444的倍数,再删去999的倍数时,显然363636的倍数被多删掉了,要加回来。
那么容斥的边界是什么呢?
对于质数ppp,显然其平方的倍数有⌊np2⌋\lfloor\dfrac n {p^2}\rfloor⌊p2n​⌋个。那么当ppp大于⌊n⌋\lfloor\sqrt n\rfloor⌊n​⌋时,⌊np2⌋=0\lfloor\dfrac n {p^2}\rfloor=0⌊p2n​⌋=0. 所以容斥的边界为p≤⌊n⌋p\le \lfloor\sqrt n\rfloorp≤⌊n​⌋.
前置知识中提到,莫比乌斯函数具有很好的容斥天赋,这题就是很好的体现。
当我们rp=max就可以想到坏的数的个数等于∑p∈Pnμ(p)⌊np2⌋\sum\limits_{p\in P}^{\sqrt n}\mu(p)\lfloor\dfrac n {p^2}\rfloorp∈P∑n​​μ(p)⌊p2n​⌋.
至此思路显然。
如果没有AC就把二分和nnn的上限往死里开。

时间复杂度为O(Trmaxlog⁡K)O(T\sqrt {r_{max}}\log K)O(Trmax​​logK),其中rmaxr_{max}rmax​表示二分的上限。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 50005;
int T, k, mu[N], pri[N], cnt = 0, vis[N];
void getmu() {mu[1] = 1;for (int i = 2; i < N; i++) {if (!vis[i]) pri[++cnt] = i, mu[i] = -1;for (int j = 1; j <= cnt && i * pri[j] < N; j++) {vis[i * pri[j]] = 1;if (i % pri[j] == 0) break;mu[i * pri[j]] = -mu[i];}}
}
bool check(LL x) {LL sum = 0;for (LL i = 1; i <= sqrt(x); i++) sum += mu[i] * (x / (i * i));if (sum >= k) return false;return true;
}
int main() {scanf("%d", &T);getmu();while (T--) {scanf("%d", &k);LL ans = 0, l = 0, r = 2e9;while (l <= r) {LL mid = l + r >> 1;if (check(mid) == true) l = mid + 1;else r = mid - 1, ans = mid;}printf("%d\n", ans);}return 0;
}
例5:约数个数和

题目
题目大意:设d(n)d(n)d(n)为nnn的约数个数,给定n,m(1≤n,m≤50000)n,m(1\le n,m\le 50000)n,m(1≤n,m≤50000),求∑i=1n∑j=1md(ij)\sum\limits_{i=1}^n\sum\limits_{j=1}^md(ij)i=1∑n​j=1∑m​d(ij). 有TTT组询问。


f(k)=∑i=1n∑j=1m[(i,j)=k]F(k)=∑i=1n∑j=1m[k∣(i,j)]=∑k∣df(d)f(k)=\sum\limits_{i=1}^n\sum\limits_{j=1}^m[(i,j)=k]\\F(k)=\sum\limits_{i=1}^n\sum\limits_{j=1}^m[k|(i,j)]=\sum\limits_{k|d}f(d)f(k)=i=1∑n​j=1∑m​[(i,j)=k]F(k)=i=1∑n​j=1∑m​[k∣(i,j)]=k∣d∑​f(d)
关于约数个数,有如下公式:
d(ij)=∑x∣i∑y∣j​[(x,y)=1]d(ij)=\sum\limits_{x|i}\sum\limits_{y|j}​[(x,y)=1]d(ij)=x∣i∑​y∣j∑​​[(x,y)=1]
证明不会。手玩或许可以感性理解。
所以有
ans=∑i=1n∑j=1m∑x∣i∑y∣j​[(x,y)=1]ans=\sum\limits_{i=1}^n\sum\limits_{j=1}^m\sum\limits_{x|i}\sum\limits_{y|j}​[(x,y)=1]ans=i=1∑n​j=1∑m​x∣i∑​y∣j∑​​[(x,y)=1]
因为∑d∣n=μ(d)=[n=1]\sum\limits_{d|n}=\mu(d)=[n=1]d∣n∑​=μ(d)=[n=1],所以
ans=∑i=1n∑j=1m∑x∣i∑y∣j∑d∣(i,j)μ(d)=∑i=1n∑j=1m∑x∣i∑y∣j∑d=1min(n,m)μ(d)×[d∣(x,y)]ans=\sum\limits_{i=1}^n\sum\limits_{j=1}^m\sum\limits_{x|i}\sum\limits_{y|j}\sum\limits_{d|(i,j)}\mu(d)\\=\sum\limits_{i=1}^n\sum\limits_{j=1}^m\sum\limits_{x|i}\sum\limits_{y|j}\sum\limits_{d=1}^{min(n,m)}\mu(d)\times[d|(x,y)]ans=i=1∑n​j=1∑m​x∣i∑​y∣j∑​d∣(i,j)∑​μ(d)=i=1∑n​j=1∑m​x∣i∑​y∣j∑​d=1∑min(n,m)​μ(d)×[d∣(x,y)]
能够变换的原因是只有当d∣(x,y)d|(x,y)d∣(x,y)时才对μ(d)\mu(d)μ(d)有贡献。
对于每个μ(d)\mu(d)μ(d),对其作出的贡献,即它的系数,为∑i=1n∑j=1m∑x∣i∑y∣j[d∣(x,y)]\sum\limits_{i=1}^n\sum\limits_{j=1}^m\sum\limits_{x|i}\sum\limits_{y|j}[d|(x,y)]i=1∑n​j=1∑m​x∣i∑​y∣j∑​[d∣(x,y)].
所以有
ans=∑d=1min(n,m)μ(d)∑i=1n∑j=1m∑x∣i∑y∣j[d∣(x,y)]ans=\sum\limits_{d=1}^{min(n,m)}\mu(d)\sum\limits_{i=1}^n\sum\limits_{j=1}^m\sum\limits_{x|i}\sum\limits_{y|j}[d|(x,y)]ans=d=1∑min(n,m)​μ(d)i=1∑n​j=1∑m​x∣i∑​y∣j∑​[d∣(x,y)]
考虑直接枚举x,yx,yx,y,若有d∣(x,y)d|(x,y)d∣(x,y),则有iii的取值有⌊nx⌋\lfloor\dfrac n x\rfloor⌊xn​⌋个,jjj的取值有⌊my⌋\lfloor\dfrac m y\rfloor⌊ym​⌋个。
所以有
ans=∑d=1min(n,m)μ(d)∑x=1n∑y=1m[d∣(x,y)]⌊nx⌋⌊my⌋ans=\sum\limits_{d=1}^{min(n,m)}\mu(d)\sum\limits_{x=1}^n\sum\limits_{y=1}^m[d|(x,y)]\lfloor\dfrac n x\rfloor\lfloor\dfrac m y\rfloorans=d=1∑min(n,m)​μ(d)x=1∑n​y=1∑m​[d∣(x,y)]⌊xn​⌋⌊ym​⌋
更换枚举项,设x′=dx,y′=dyx'=dx,y'=dyx′=dx,y′=dy,则
ans=∑d=1min(n,m)μ(d)∑x′=1⌊nd⌋∑y′=1⌊md⌋[d∣(x′,y′)]⌊ndx′⌋⌊mdy′⌋=∑d=1min(n,m)μ(d)∑x′=1⌊nd⌋∑y′=1⌊md⌋⌊ndx′⌋⌊mdy′⌋ans=\sum\limits_{d=1}^{min(n,m)}\mu(d)\sum\limits_{x'=1}^{\lfloor\frac n d\rfloor}\sum\limits_{y'=1}^{\lfloor\frac m d\rfloor}[d|(x',y')]\lfloor\dfrac n {dx'}\rfloor\lfloor\dfrac m {dy'}\rfloor\\=\sum\limits_{d=1}^{min(n,m)}\mu(d)\sum\limits_{x'=1}^{\lfloor\frac n d\rfloor}\sum\limits_{y'=1}^{\lfloor\frac m d\rfloor}\lfloor\dfrac n {dx'}\rfloor\lfloor\dfrac m {dy'}\rfloorans=d=1∑min(n,m)​μ(d)x′=1∑⌊dn​⌋​y′=1∑⌊dm​⌋​[d∣(x′,y′)]⌊dx′n​⌋⌊dy′m​⌋=d=1∑min(n,m)​μ(d)x′=1∑⌊dn​⌋​y′=1∑⌊dm​⌋​⌊dx′n​⌋⌊dy′m​⌋
类比∑i=1a∑j=1bij=(∑i=1ai)(∑j=1bj)\sum\limits_{i=1}^a\sum\limits_{j=1}^bij=(\sum\limits_{i=1}^a i)(\sum\limits_{j=1}^b j)i=1∑a​j=1∑b​ij=(i=1∑a​i)(j=1∑b​j),有
ans=∑d=1min(n,m)μ(d)(∑x′=1⌊nd⌋⌊ndx′⌋)(∑y′=1⌊md⌋⌊mdy′⌋)ans=\sum\limits_{d=1}^{min(n,m)}\mu(d)(\sum\limits_{x'=1}^{\lfloor\frac n d\rfloor}\lfloor\dfrac n {dx'}\rfloor)(\sum\limits_{y'=1}^{\lfloor\frac m d\rfloor}\lfloor\dfrac m {dy'}\rfloor)ans=d=1∑min(n,m)​μ(d)(x′=1∑⌊dn​⌋​⌊dx′n​⌋)(y′=1∑⌊dm​⌋​⌊dy′m​⌋)
将∑i=1n⌊ni⌋\sum\limits_{i=1}^n\lfloor\dfrac n i\rfloori=1∑n​⌊in​⌋花费O(nn)O(n\sqrt n)O(nn​)的时间整除分块预处理得到sum[i]sum[i]sum[i],则
ans=∑d=1min(n,m)μ(d)sum[nd]sum[md]ans=\sum\limits_{d=1}^{min(n,m)}\mu(d)sum[\dfrac n d]sum[\dfrac m d]ans=d=1∑min(n,m)​μ(d)sum[dn​]sum[dm​]
此时再对nd,md\dfrac n d,\dfrac m ddn​,dm​整除分块,每次询问的时间复杂度为O(n)O(\sqrt n)O(n​). 加上TTT组询问,总的时间复杂度为O(Tn)O(T\sqrt n)O(Tn​).

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 50005;
int T, n, m, mu[N], vis[N], pri[N], cnt = 0;
LL f[N];
void getf() {for (int i = 1; i < N; i++)for (int l = 1, r; l <= i; l = r + 1) {r = i / (i / l);f[i] += 1ll * (r - l + 1) * (i / l);}
}
void getmu() {mu[1] = 1;for (int i = 2; i < N; i++) {if (!vis[i]) pri[++cnt] = i, mu[i] = -1;for (int j = 1; j <= cnt && i * pri[j] < N; j++) {vis[i * pri[j]] = 1;if (i % pri[j] == 0) break;mu[i * pri[j]] = -mu[i];}}for (int i = 2; i < N; i++) mu[i] += mu[i - 1];
}
int main() {getf(), getmu();scanf("%d", &T);while (T--) {scanf("%d%d", &n, &m);LL ans = 0;for (int i = 1, r; i <= min(n, m); i = r + 1) {r = min(n / (n / i), m / (m / i));ans += 1ll * (mu[r] - mu[i - 1]) * f[n / i] * f[m / i];}printf("%lld\n", ans);}return 0;
}

总结

莫比乌斯反演能够将难以直接求解的函数转化为容易求解的函数求值。

莫比乌斯反演的题目大都有一个或多个和式,以及gcdgcdgcd,或者与gcdgcdgcd紧密相关的函数,如约数和函数σ\sigmaσ.

莫比乌斯反演通常有如下步骤:

  • 将原问题转化为类∑i=1n\sum\limits_{i=1}^ni=1∑n​的和式
  • 设应求函数f(n)f(n)f(n)和易求函数F(n)F(n)F(n),F(n)F(n)F(n)多与gcdgcdgcd有关,得到F(n)F(n)F(n)与f(n)f(n)f(n)的关系式和F(n)F(n)F(n)的易求形式
  • 反演f(n)f(n)f(n),得到和式,带入F(n)F(n)F(n)易求形式
  • 和式除以gcdgcdgcd,消除gcdgcdgcd的影响
  • 更换枚举顺序,分离∑\sum∑
  • 更换枚举变量,将∑\sum∑的枚举变量变成连续的正整数,方法通常是设d′=ndd'=\dfrac n dd′=dn​或dn\dfrac d nnd​
  • 考虑整除分块及预处理,可能有杜教筛

第333到666步因人而异,可能有些没有,有些顺序不同。有时候一些步骤需要重复多次。

总的来说,莫比乌斯反演的题目就是和式的变换,AC这些题目的前提就是精通和式变换。

莫比乌斯反演要多练题才能对其有比较深入的理解。

【笔记】莫比乌斯反演(1)相关推荐

  1. 【莫比乌斯反演】10.30破译密码

    初涉的话先留坑吧 题目大意 $\sum_{i_1}^{a_1}\sum_{i_2}^{a_2}\cdots\sum_{i_m}^{a_m}(i_1,i_2,\cdots,i_m)$ $a_i<= ...

  2. 【算法笔记】莫比乌斯反演(包含定理,两种形式的证明及入门经典模板)

    整理的算法模板合集: ACM模板 目录 一.莫比乌斯反演 二.几个概念和定理 三.两种形式的莫比乌斯反演证明 四.POJ 3904 Sky Code(入门例题) 一.莫比乌斯反演 学习笔记,我是看这个 ...

  3. 莫比乌斯反演专题学习笔记

    莫比乌斯反演专题学习笔记 本文记录一些和莫反有关的内容的笔记 可能存在诸多谬误,阅读时请谨慎分析 若发现文中有谬误,如您愿意,恳请您向我指出,不胜感激! 为什么要学莫比乌斯反演? 解决一类与狄利克雷卷 ...

  4. SDOI2015 约数个数和(莫比乌斯反演经典、双上限整除分块)超详细笔记

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 AcWing 1358. 约数个数和(莫比乌斯反演经典.双上限整除分块) #include <c ...

  5. BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MB Submit: 4032  Solved: 1817 [Submi ...

  6. 莫比乌斯反演学习笔记

    背景: 之前不会用MarkdownMarkdownMarkdown,所以坑没有补. 定义: 以下除法默认向下去整. 对于一个形如Fn=∑d∣nfdF_n=\sum_{d|n}f_dFn​=∑d∣n​f ...

  7. [数论]莫比乌斯反演1

    索引 莫比乌斯反演1 定理 莫比乌斯反演2 证明 莫比乌斯反演3 技巧 前言 本篇内容全部为定理,无证明 定义 莫比乌斯函数的符号为\(\mu\),通俗的来讲 \[ \mu(n) = \left\{ ...

  8. 莫比乌斯反演小结 + 黑暗爆炸 2301

    1.前言 莫比乌斯反演课上听蒙了,后来重新捋了一遍思路,看了一下示例,就明白了,写篇学习笔记总结下 2.一些引理 引理1 (莫比乌斯定理) ∑d∣nμ(n)={1,n=10,n≠1\sum_{d|n} ...

  9. 莫比乌斯反演入门讲解

    莫比乌斯反演实际上是一两个公式定理的运用,自认为想要掌握它的话,其中的证明还是有必要了解的.看过网上一些博客,感觉都只证明了一半,没看到有人将这个定理完全证明出来.然而我最近在正好在学习初等数论,发现 ...

最新文章

  1. Windows10 将 YOLOX模型转换为OpenVINO需要的IR文件
  2. python连连看小游戏_利用Python制作一个连连看小游戏,边学边玩!
  3. Hive设计和体系结构
  4. solr java api_Solr7.4.0的API(Solrj)操作
  5. 如何在阿里云上安全的存放您的配置
  6. 数据挖掘 自习笔记 第三章 定性归纳实践(下)
  7. 用vs2008编写和调试linux程序 ----VisualGDB 使用教程
  8. ads2011射频电路设计与仿真实例
  9. C语言——是否为闰年的判断
  10. FFMPEG学习【libavfilter】(二)
  11. Q9.1 Ruan upp a staircase
  12. 原来在Android中请求权限也可以有这么棒的用户体验(转自郭霖)
  13. hⅰgh怎么读音发音英语_gh和ph的发音
  14. 微信wifi路由器怎么连接服务器,介绍下微信WIFI路由器怎么设置的方法
  15. 抖音短连接v.douyin.com/xxx 如何生成?
  16. 下载 傅立叶变换 冷建华pdf_傅里叶变换_PDF图书下载_冷建华_免费PDF电子书下载_第一图书网...
  17. 《狂飙》壁纸大嫂如此惊艳,做成日历壁纸天天看(7)
  18. 高性能架构学习路线图-分布式架构演进
  19. linux内核添加系统调用(详细)
  20. 百度地图修改底图样式

热门文章

  1. 【GD32】GD32设置TIMER0输出PWM
  2. node.js -redis -bull
  3. opencv-python 立体图像的深度图
  4. 词霸天下---142词根 【-scape- 形状 】
  5. 安卓开发 异常处理 Invalid VCS root mapping The directory
  6. 微信公众号 chinaxdt 的 解压密码 mima
  7. 设计模式之适配器模式 :外部系统接口的使用
  8. python的自定义函数
  9. Android微信界面
  10. 考研计算机385分什么水平,考研难吗?385分学长华中科技大学经验谈