【算法专题】积性函数
【参考】
任之洲数论函数.pdf
【变化技巧总结】
总结下面所有知识含有的变化技巧
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.函数为加法时,可以分别统计前缀和再相加,但乘法必须一起统计。
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}})$。(这暂时不太清楚)