【算法专题】积性函数

【参考】

浅谈一类积性函数的前缀和 by skywalkert

任之洲数论函数.pdf

论逗逼的自我修养之寒假颓废记 by jiry_2

杜教筛 [学习笔记]【更新中】 by Candy?

 

【变化技巧总结】

总结下面所有知识含有的变化技巧

1.先枚举gcd值。

2.莫比乌斯反演处理gcd,[gcd(x,y)=1]=Σd|i^d|jμ(d),然后将d提到最前面。

3.★分块取值优化,ans=Σf(d)*g(n/d),其中g(n/d)只有2√n种取值,预处理f(d)的前缀和即可O(√n)。

4.多组询问时,对于ΣdΣe,令T=de,则ΣTΣd|T,后面枚举倍数贡献可以O(n ln n)预处理前缀和。

5.杜教筛:倍数和总数互换,即

$sum_{i=1}^{n}(f*g)(i)=\sum_{i=1}^{n}\sum_{d|i}f(d)g(\frac{i}{d})=\sum_{i=1}^{n}\sum_{d=1}^{\frac{n}{i}}f(d)g(i)=\sum_{i=1}^{n}g(i)F(\frac{n}{i})$

用这个变化,对于卷积f*g=h,知二求一。

6.函数为加法时,可以分别统计前缀和再相加,但乘法必须一起统计。

 

例题:【51nod】1238 最小公倍数之和 V3 杜教筛

1.相同的完全积性函数卷积有奇效(在这题是同阶幂函数卷积)。

2.矩阵转上三角,就可以变成积性函数前缀和的形式。

3.狄利克雷卷积有交换律,结合律,加法分配律。点乘有卷积分配律,即a(b*c)=ab*ac。

4.φ也可以化简[(n,i)=1],不一定用μ。

 

例题:【Project Euler】530 GCD of Divisors 莫比乌斯反演

1.对于[(a,b)=d],可以将共有因子d提出来并压缩枚举空间。

2.约数个数前缀和可以O(√n),看到可以转化过去。

3.两个Σ1~n,可以合并为枚举乘积,然后变成卷积的形式。

4.复杂度不一定是看到的那样,要好好分析或好好感受。

 

【积性函数】

积性函数的约数和,前缀和,相互卷积也是积性函数。

1.f(1)=1。

2.性质一:对于n=∏pi^ki,有f(n)=∏f(pi^ki)

性质二:对于完全积性函数,还有f(n)=∏f(pi)^ki以及f(n^k)=f(n)^k

常见的积性函数:

1.d(n)=Σd|n 1,表示n的因子个数,即d=1*1

2.σ(n)=Σd|n d,表示n的因子和,即σ=1*id

3.1(n)=1,恒等函数

4.id(n)=n,单位函数

5.e(n)=[n=1],元函数,即f=f*e

6.φ(n)=Σ[(n,i)=1]*1,欧拉函数

φ*1=id

7.μ(n),莫比乌斯函数,μ(n)=(-1)^k,k为n的素因子个数,有重复素因子时μ=0

μ*1=e

 

【狄利克雷卷积】

定义两个数论函数f,g的狄利克雷卷积:(f*g)(n)=Σd|nf(d)*g(n/d)。

1.莫比乌斯函数,e(n)=Σd|nμ(d),即e=μ*i。

莫比乌斯反演,由g=f*i,得f=g*μ。(可以看出μ和1互为逆元)

证明:f=g*μ=f*i*μ=f*e=f。

即由g(n)=Σd|nf(d),得f(n)=Σd|ng(d)*μ(n/d)。

类似的,由g(n)=Σn|df(d),得f(n)=Σn|dg(d)*μ(d/n)。

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

2.欧拉函数,n=Σd|nφ(d),即id=φ*i。

$$\sum_{d|n}\varphi(d)=n\ \ (\varphi \times 1=id)$$

证明:考虑n的所有数字x∈[1,n],有(n,x)=d即(n/d,x/d)=1,所以满足(n,x)=d的所有的x的个数为φ(n/d),那么所有n的因子的φ就是答案。

由反演得,φ=id*μ,即φ(n)/n=Σd|nμ(d)/d。

$$\varphi(n)=\sum_{d|n}\frac{n}{d}*\mu(d)\ \ (\mu \times id=\varphi)$$

公式:1~n中与n互质的整数和是为( n*φ(n)+[n=1] )/2,证明:gcd(n,i)=gcd(n,n-i),所以互素数总是成对出现。(但约数和不是n*(n+1)/2-n*φ(n)/2+1……)。

莫比乌斯反演

 

【和式Σ变换技巧】

基本法则(具体数学):

1.分配律,Σkc*ak=c*Σkak,即提出与Σ无关的乘数。

2.结合律,将相邻Σ的条件结合或分离。

3.交换律,即Σ的枚举可以改变顺序。

4.一般分配律,Σj,kaj*bk=(Σaj)*(Σbk)

5.多重交换律,当相邻Σ枚举域相关时,需满足:

[j∈J][k∈K(j)]=[k∈K'][j∈J'(k)]

通常J=K'是所有整数集合,第二重根据操控二重和式性质的p(j,k)推出。

6.换元,即更换Σ的枚举元。

7.艾弗森约定,即将Σ底端限制变成条件,如Σi∈Ii = Σi*[i∈I]。

【杜教筛】

参考:浅谈一类积性函数的前缀和 by skywalkert

给定数论函数$f(n)$,求$s(n)=\sum_{i=1}^{n}f(i)$。

考虑找到一个合适的数论函数$g(n)$。

杜教筛基本变化(总值与倍数互换)

$$\sum_{i=1}^{n}(f*g)(i)=\sum_{i=1}^{n}\sum_{d|i}f(d)g(\frac{i}{d})=\sum_{i=1}^{n}g(i)s(\frac{n}{i})$$

最终

$$g(1)s(n)=\sum_{i=1}^{n}(f*g)(i)-\sum_{i=2}^{n}g(i)s(\frac{n}{i})$$

本质上是构造卷积h=f*g,若h和g的前缀和可以O(1)或O(√n)快速求解,则可以用上式快速求解f的前缀和。

最后将f的前n^(2/3)项预处理,总复杂度O(n^(2/3))。

求N和N/i时,s(i)记忆化到f[N/i]中,f[]数组大小只需要√N。(N变化时要清空数组)

例题:【51nod】1239 欧拉函数之和 求Σφ(i)

 

复杂度证明:

根据(x/a)/b=x/(ab),杜教筛只用到2√n个值,所以杜教筛的复杂度是:

$$\sum_{i=1}^{\sqrt n}O(\sqrt i)+\sum_{i=1}^{\sqrt n}O(\sqrt{\frac{n}{i}})$$

计算复杂度需要用到积分:

$$\int_{0}^{a}x^n=\frac{1}{n+1}a^{n+1}$$

所以,前半部分的复杂度:

$$\sum_{i=1}^{\sqrt n}O(\sqrt i)=\int_{0}^{\sqrt n}x^\frac{1}{2}\approx \sqrt n^{\frac{1}{2}+1}=O(n^{\frac{3}{4}})$$

后半部分的复杂度:(把√n提出来,最后是n^(3/4))

$$\sum_{i=1}^{\sqrt n}O(\frac{1}{\sqrt i})=\int_{0}^{\sqrt n}x^{-\frac{1}{2}}\approx \sqrt n^{-\frac{1}{2}+1}=O(n^{\frac{1}{4}})$$

最终,复杂度$O(n^{\frac{3}{4}})$,预处理前2/3项后复杂度为$O(n^{\frac{2}{3}})$。(这暂时不太清楚)

 

posted @ 2018-02-23 11:13  ONION_CYC  阅读(1120)  评论(0编辑  收藏  举报