积性函数的整理

定义

如果一个数论函数\(f(n)\)满足

\[f(pq)=f(p)f(q),p\perp q \]

则称\(f(n)\)是一个积性函数。

特别的,如果不要求\(p\perp q\)且依然满足上述式子的话,则称\(f(n)\)是一个完全积性函数。

简单约定

\((i,j)\)表示\(gcd(i,j)\)

\([a]\)表示一个条件判断函数,当\(a\)为真是\([a]=1\),否则\([a]=0\)

\(i\perp j\)表示\((i,j)==1\)

狄利克雷卷积懒得打括号了。

常见积性函数

\[e(n)=[n=1] \]

\[1(n)=1 \]

\[\mu(n)=\begin{cases}(-1)^k&n=p_1p_2p_3\dots p_k\\0&n=p^2q\end{cases} \]

\[\varphi(n)=\sum_{i=1}^n[i\perp n] \]

\[d(n)=\sum_{i|n}1 \]

\[id(n)=n \]

\[\sigma(n)=\sum_{d|n}d \]

至于它们为什么是积性函数,,,,

我也管不了那么多了。

狄利克雷卷积

定义

\[f*g(n)=\sum_{d|n}f(d)g(\frac nd) \]

要计算的话可以把枚举约数换成枚举倍数(下面会讲到),以调和级数\(O(nlogn)\)的复杂度求出\(f*g\)的前\(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*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) \]

常见积性函数的卷积

\[\forall f(n),e*f(n)=f(n) \]

\[1*1(n)=\sum_{d|n}1=d(n) \]

\[id*1(n)=\sum_{d|n}d=\sigma(n) \]

\[\mu*1(n)=\sum_{d|n}\mu(d)=[n=1]=e(n) \]

这个需要特别说明一下。

假设\(n=p_1^{k_1}p_2^{k_2}\dots p_m^{k_m}\),那么上式可以改写成:

\[\mu*1(n)=\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}) \]

观察\(\mu(n)\)的定义,可以发现它与\(n\)的质因子个数有关,而且当某个质因子出现不止一次时,\(\mu(n)=0\)。这样的话,只要\(c_1\)\(c_n\)中有任意一个大于\(1\),后面那个\(\mu\)值就为\(0\)

这样的话,我们就可以大大降低枚举范围:

\[\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}^mc_i} \]

\[=\sum_{i=0}^m(-1)^i\dbinom mi \]

\[=[m=0]=[n=1]=e(n) \]

至于最后那个式子为什么是\([m=0]\),证法多种多样,这里不再赘述。

那么继续:

\[\varphi*1(n)=\sum_{d|n}\varphi(d)=n=id(n) \]

这个又是为什么?

直接证比较麻烦,我们利用\(\mu*1=e\)证一个反过来的式子:

\[\varphi(n)=id*\mu(n) \]

直接暴力拆式子即可。要用到下面讲到的一些技巧,可以回头再来看。

\[\varphi(n)=\sum_{i=1}^n[i\perp n] \]

\[=\sum_{i=1}^n[(i,n)==1] \]

\[=\sum_{i=1}^n\sum_{d|(i,n)}\mu(d) \]

\[=\sum_{d|n}\mu(d)\frac nd \]

\[=id*\mu(n) \]

这样,我们就完成了上述积性函数的大一统:

\[\mu\xrightarrow{*1}e\xrightarrow{*1}1\xrightarrow{*1}d \]

\[\varphi\xrightarrow{*1}id\xrightarrow{*1}\sigma \]

反过来也可以:

\[\mu\xleftarrow{*\mu}e\xleftarrow{*\mu}1\xleftarrow{*\mu}d \]

\[\varphi\xleftarrow{*\mu}id\xleftarrow{*\mu}\sigma \]

莫比乌斯反演

类似于二项式反演和斯特林反演,有一个这样的反演式子:

\[f(n)=\sum_{d|n}g(d)\iff g(n)=\sum_{d|n}\mu(\frac nd)f(d) \]

其实没毛用,因为它的本质就是这样的:

\[f=g*1\iff g=\mu*f \]

但这样看的话,似乎就是废话了。

常用推式子技巧

无关项提前

本质是分配律。

\[\sum_{i=1}^n\sum_{j=1}^ma_ib_j=\sum_{i=1}^na_i\sum_{j=1}^mb_j \]

交换枚举顺序

\[\sum_{i=1}^na_i\sum_{j=1}^mb_j=\sum_{j=1}^mb_j\sum_{i=1}^na_i \]

这个看上去还是很\(naive\)

比较重要的是枚举约数变成枚举倍数:

\[\sum_{i=1}^na_i\sum_{d|i}b_d=\sum_{d=1}^nb_d\sum_{i=1}^{\lfloor\frac nd\rfloor}a_{id} \]

反演

就是活用上面那几个常用积性函数的狄利克雷卷积关系式,尤其是\(\mu*1=e\)

算法

数论分块

这个居然在我很\(naive\)的时候自己\(yy\)出来了。

举个例子,求\(\sum_{i=0}^n\lfloor\frac ni\rfloor,n\leq10^9\)

不会的话打个表,然后就会了

\(n=100\)时,可以发现\(\lfloor\frac n{100}\rfloor,\lfloor\frac n{99}\rfloor,\dots,\lfloor\frac n{51}\rfloor\)都是\(1\)\(\lfloor\frac n{50}\rfloor,\lfloor\frac n{49}\rfloor,\dots,\lfloor\frac n{34}\rfloor\)都是\(2\),这样的话,我们得到了一个可靠的结论:

\(\lfloor\frac n{\lfloor\frac ni\rfloor+1}\rfloor,\lfloor\frac n{\lfloor\frac ni\rfloor+2}\rfloor,\dots,\lfloor\frac n{\lfloor\frac n{i+1}\rfloor}\rfloor\)的结果都是\(i+1\)

这样我们就得到了一个快速的根号算法:

对于大于\(\sqrt n\)的数,不同的\(\lfloor\frac ni\rfloor\)只有\(\sqrt n\)个;

小于\(\sqrt n\)的数只有\(\sqrt n\)个,直接暴力算即可。

线性筛

这个比较简单,只要我们探究出\(f(p^k)\)的表达式,就可以线性筛出所有\(f(i)\)

杜教筛

假如我们要求\(s(n)=\sum_{i=1}^nf(i)\),如果我们能够找到另一个函数\(g(n)\)使得\(g(n)\)\(f*g(n)\)都比较好求,我们就可以利用杜教筛。

具体过程是这样的:

\[\sum_{i=1}^nf*g(i)=\sum_{i=1}^n\sum_{d|i}f(\frac id)g(d) \]

\[=\sum_{d=1}^ng(d)\sum_{i=1}^{\lfloor\frac nd\rfloor}f(i) \]

\[=\sum_{d=1}^ng(d)s(\lfloor\frac nd\rfloor) \]

\(d=1\)时,\(s(\lfloor\frac nd\rfloor)\)就是\(s(n)\),所以有

\[s(n)=\sum_{d=1}^ng(d)s(\lfloor\frac nd\rfloor)-\sum_{d=2}^ng(d)s(\lfloor\frac nd\rfloor) \]

\[=\sum_{i=1}^nf*g(i)-\sum_{d=2}^ng(d)s(\lfloor\frac nd\rfloor) \]

这样,如果我们能够快速求出\(\sum_{i=1}^nf*g(i)\)\(g(d)\),我们就可以对右边数论分块进行递归求解。我们可以用线性筛筛出前面一部分来优化复杂度。

复杂度是\(O(n^{\frac23})\),证明并不会,可以参考这个

\(min\_25\)

不会。

留着坑吧,没准哪天会了

不过也要退役了

应用

1、求\(\sum_{i=1}^n\sum_{j=1}^m[i\perp j],n,m\leq10^9\)

需要用到的东西上面已经全部给出了。要注意\([i\perp j]\)其实就是\(e((i,j))\)

\[\sum_{i=1}^n\sum_{j=1}^m\sum_{d|(i,j)}\mu(d) \]

\[=\sum_{d=1}^n\mu(d)\sum_{i=1}^{\lfloor\frac nd\rfloor}\sum_{j=1}^{\lfloor\frac md\rfloor}1 \]

\[=\sum_{d=1}^n\mu(d)\lfloor\frac nd\rfloor\lfloor\frac md\rfloor \]

数论分块套上杜教筛求出\(\sum\mu(d)\)即可。

杜教筛\(\mu\)的话,令函数\(g\)\(1\)函数,此时\(\sum_{i=1}^n\mu*1(i)=1\)\(1\)函数本身也没有任何难度可言。

2、求\(\sum_{i=1}^n\sum_{j=1}^m(i,j),n,m\leq10^9\)

同样的,因为\((i,j)\)就是\(id((i,j))\),所以套用上一题做法即可。

\[\sum_{i=1}^n\sum_{j=1}^m\sum_{d|(i,j)}\varphi(d) \]

\[=\sum_{d=1}^n\varphi(d)\lfloor\frac nd\rfloor\lfloor\frac md\rfloor \]

杜教筛\(\varphi\)的话,我们同样令\(g\)\(1\)函数,此时\(\sum_{i=1}^n\varphi*1(i)=\frac{n(n+1)}2\)

3、给出一个\(n*m\)的点阵,如果一对点连成的线段不经过其它点,那么称这对点是合法的。求有多少合法的点对。

这是我原创的一道蠢题……做法就交给各位神仙了。

……

备注

给出一些可能用到的链接:

模板

杜教筛

例题

例题1

例题2(人生第一道紫题,自己yy出了一个\(O(n\sqrt n)\)的做法,现在看起来好\(low\)啊)

例题3(数据有误)

posted @ 2019-06-28 12:05  star_city  阅读(2407)  评论(0编辑  收藏  举报