积性函数前缀和-我的总结
【写在前面】
用了一个多星期将这部分大体弄懂了,东西太多,有不少技巧,本身从新写了一下,记录本身的理解。内容与原文基本一致,在其基础上加上了一些我感受比较重要的但他没有详细说明的东西。如下都是我逐字打出来的。若是有什么错误,请指出。html
前置技能里面的东西须要充分理解和记忆,在后面推导过程当中会屡次用到前置技能里面的东西。ios
转载出处:c++
author: skywalkert
original article: http://blog.csdn.net/skywalkert/article/details/50500009web
【经常使用技巧】
k=1∑nd∣k∑d⋅k=k=1∑nd=1∑knd⋅k⋅d=d=1∑nk∣d∑d⋅kd=d=1∑nk=1∑dnd⋅k⋅d=d=1∑nd∣k∑d⋅k=k=1∑nk∣d∑d⋅kd上式为约数,倍数之间重要的变换,需要充分理解并熟练运用。∣1、遇到[gcd(i,j)=1],考虑将其转换为k∣gcd(i,j)∑μ(k)2、对于i=1∑nj=1∑n[gcd(i,j)=1]=2i=1∑nj=1∑i[gcd(i,j)=1]−i=1∑n[gcd(i,i)=1]=(2i=1∑nφ(i))−13、i=1∑nij=1∑n[gcd(i,j)=1]⋅j=2i=1∑nij=1∑i[gcd(i,j)=1]⋅j−i=1∑n[gcd(i,i)=1]⋅i=(2i=1∑ni2i⋅φ(i)+[i=1])−1=(i=1∑ni2⋅φ(i)+[i=1])−14、记w(n)为n的质因子的个数,则2w(n)为n的约数中无平方因子的个数,则f(n)=2w(n)=d∣n∑μ2(d)则σ0(n2)=d∣n∑f(d)=d∣n∑k∣d∑μ2(k),附个表i=1∑10σ(i2)5、n以内非完全平方数的个数g(n)=i=1∑nμ2(i)=i=1∑n
μ(i)⋅⌊i2n⌋6、d∣n∑i∑dn=d∣n∑i∑d,且d∣n可以用埃筛预处理,i为d,j为n。7、σ0(i⋅j)=d∣i⋅j∑=x∣i∑y∣j∑[gcd(i,j)=1],σ1(i⋅j)=d∣i⋅j∑d=x∣i∑y∣j∑xy⋅n[gcd(i,j)=1]数组
证实7:
令x=i⋅j,则由惟一分解定理得:x=p1e1p2e2…pnek,则x的约数个数为(e1+1)⋅(e2+1)…(ek+1)考虑任意一个质数p对答案的贡献。假设质数p在i的质因数中出现了a次在j的质因数中出现了b次,那么p对答案的贡献就为a+b+1。而a+b+1=x=0∑ay=0∑b[gcd(px,py)=1],等效与以下矩阵:a=2,b=3⎝⎛1111pp1pp21pp2⎠⎞相当于对于素数p来说,不同时出现于两个数的质因数中。由惟一分解定理又得:i=p1e1p2e2p3e3...pkek,j=p1q1p2q2p3q3...pkqk,根据乘法原理可得:σ0(i⋅j)=x1=0∑e1y1=0∑q1[(p1x1,p1y1)=1]x2=0∑e2y2=0∑q2[(p2x2,p2y2)=1]...xn=0∑enyn=0∑qn[(pnxn,pnyn)=1]将其合并得:σ0(i⋅j)=x∣i∑y∣j∑[gcd(x,y)=1]对于任意一个素数p来说,它们不同时出现于x,y中,就相当于gcd(x,y)=1。app
[摘自]: < https://blog.csdn.net/ab_ever/article/details/76737617 >ide
σ1(n⋅m)=a∣n⋅m∑a=k=1∑rc∣∣Pkxk+yknm∑a∣Pkxk+yk∑ac=a1∣∣P1x1+y1∑a2∣∣P2x2+y2∑...ar∣∣Prxr+yr∑(i=1∏rai)对于某个素数pk:a∣∣Pkxk+yk∑a=a∣Pkxk∑b∣Pkyk∑[gcd(a,b)=1]aPkxkb所以:σ1(n⋅m)=a∣n∑b∣m∑an⋅b[gcd(a,b)=1]svg
二、
10
1 1 1 1 1 1 1 1 1 1
1 0 1 0 1 0 1 0 1 0
1 1 0 1 1 0 1 1 0 1
1 0 1 0 1 0 1 0 1 0
1 1 1 1 0 1 1 1 1 0
1 0 0 0 1 0 1 0 0 0
1 1 1 1 1 1 0 1 1 1
1 0 1 0 1 0 1 0 1 0
1 1 0 1 1 0 1 1 0 1
1 0 1 0 0 0 1 0 1 0
四、
1 1
1 2 4 1 1 2
1 3 9 1 1 3
1 2 4 8 16 1 1 2 1 2
1 5 25 1 1 5
1 2 3 4 6 9 12 18 36 1 1 2 1 3 1 2 3 6
1 7 49 1 1 7
1 2 4 8 16 32 64 1 1 2 1 2 1 2
1 3 9 27 81 1 1 3 1 3
1 2 4 5 10 20 25 50 100 1 1 2 1 5 1 2 5 10
48 48
【前置技能】
【积性函数的定义】
- 若
f(n)的定义域为正整数域,值域为复数,即
f:Z+→C,则称
f(n)为数论函数。
- 若
f(n)为数论函数,且
f(1)=1,对于互质的正整数
p,q有
f(p⋅q)=f(p)⋅f(q),则称其为积性函数。
- 若
f(n)为积性函数,且对于任意正整数
p,q都有
f(p⋅q)=f(p)⋅f(q),则称其为彻底积性函数。
【积性函数的性质与例子】
- 若
f(n)为积性函数,则对于正整数
n=∏i=1tpiei有
f(n)=∏i=1tf(piei);若f(n)为彻底积性函数,则对于正整数
n=∏i=1tpiei有
f(n)=∏i=1tf(pi)ei。
- 常见的积性函数有:
- 除数函数
σk(n)=∑d∣ndk,表示n的约数的k次幂和,注意
σk(n)与
σk(n)是不一样的。
- 由惟一分解定理得:
n=∏i=1tpiei。则
σk(n)=∏i=1tσk(piei)=∏i=1t∑d∣pieidk=∏i=1t(1+pk+p2k+p3k+⋯+peik)
- 约数个数函数
τ(n)=σ0(n)=∑d∣n1,表示
n的约数个数,通常也写为
d(n)。
-
σ0(n)=∏i=1tσ0(piei)=∏i=1t(1+p0+p0+p0+⋯+p0)=∏i=1tei+1。
- 约数和函数
σ(n)=σ1(n)=∑d∣nd,表示
n的约数之和。
-
σ1(n)=∏i=1t(1+p1+p2+p3+⋯+pei)。
ps:括号内的能够用等比数列求和公式简化。
- 欧拉函数
φ(n)=∑i=1n[(n,i)=1]⋅1,表示不大于
n且与
n互质的正整数的个数,另外
∑i=1n[(n,i)=1]⋅i=2n⋅φ(n)+[n=1],且对于正整数
n>2来讲
φ(n)是偶数。
-
n̸=1时,2∑i=1n[(n,i)=1]⋅i=∑i=1n[(n,i)=1]⋅i+∑i=1n[(n,i)=1]⋅(n−i)=∑i=1n[(n,i)=1]⋅n=n∑i=1n[(n,i)=1]=n⋅φ(n),则∑i=1n[(n,i)=1]⋅i=2n⋅φ(n)
- 莫比乌斯函数
μ(n),在狄利克雷卷积的乘法中与恒等函数互为逆元,
μ(1)=1,对于无平方因子数
n=∏i=1tpi有
μ(n)=(−1)t,对于有平方因子数
n有
μ(n)=0。
- 元函数
e(n)=[n=1],狄利克雷卷积的乘法单位元,彻底积性。
- 恒等函数
I(n)=1,彻底积性。
- 单位函数
id(n)=n,彻底积性。
- 幂函数
idk(n)=nk,彻底积性。
- 关于莫比乌斯函数和欧拉函数有两个经典的公式
-
[n=1]=∑d∣nμ(d),将
μ(d)看做是容斥的系数便可证实。
-
n=∑d∣nφ(d),将
ni(1≤i≤n)化为最简分数统计个数便可证实。
【狄利克雷卷积与莫比乌斯反演】
- 数论函数
f和
g狄利克雷卷积定义为
(f∗g)(n)=∑d∣nf(d)⋅g(dn),狄利克雷卷积知足交换律
((f∗g)(n)=(g∗f)(n)=∑d∣ng(d)f(dn))、结合律
(f∗g∗h=f∗(g∗h)),对加法知足分配律,存在单位元函数
e(n)=[n=1]使得
f∗e=f=e∗f,若
f和
g为积性函数则
f∗g也为积性函数。
- 狄利克雷卷积的一个经常使用技巧是对于积性函数
f与恒等函数
I的卷积的处理,例如
n=∏i=1tpiei,(f∗I)(n)=∑d∣nf(d)I(dn)=∑d∣nf(d)=∏i=1t∑j=0eif(pij)。
- 莫比乌斯反演也是对于
g(n)=∑d∣nf(d)(g=f∗I) 的讨论,可是不要求
f 是积性函数,适用于已知
g(n)求
f(n) 的状况,因为
(I∗μ)(n)=∑d∣nμ(d)=e(n),则
g∗μ=(f∗I)∗μ=f∗(I∗μ)=f∗e=f,即若
g=f∗I,则
f(n)=(g∗μ)(n)=∑d∣ng(d)⋅μ(dn),相似的有
g(n)=∑n∣df(d)⇒f(n)=∑n∣dg(d)⋅μ(nd),二项式反演也是相似的技巧。有一个例子能够看出欧拉函数和莫比乌斯函数之间的关系,因为
∑d∣nφ(d)=id(n),因此
φ(n)=∑d∣nμ(d)⋅dn,即
nφ(n)=∑d∣ndμ(d)。
【正文:黑科技】
这种黑科技在低于线性时间的复杂度下解决一类积性函数的前缀和问题。函数
首先看一个简单的例子,求前
n个正整数的约数之和,即
∑i=1nσ(i),其中
n≤1012。显然不能直接作了,可是咱们能够推导一番:
方法1:i=1∑nσ(i)=i=1∑nd∣i∑d=d=1∑ndi=1∑dn=i=1∑ni⋅⌊in⌋方法2:i=1∑nσ(i)=i=1∑nd∣i∑d=i=1∑nd=1∑ind=i=1∑n2⌊in⌋⋅(⌊in⌋+1)
当
i≤n
时,
⌊in⌋显然只有
O(n
)个取值;当
i≥n
一样;对于固定的
⌊in⌋,
i的取值是一段连续的区间,这段区间是
[⌊⌊in⌋+1n⌋+1,⌊⌊in⌋n⌋],所以能够
O(n
)求得。优化
例
n=10时,
∑i=1nσ(i)=1×10+2×5+3×3+4×2+5×2+6×1+7×1+8×1+9×1+10×1,
则
∑i=1nσ(i)=10×1+5×2+3×3+2×(4+5)+1×(6+7+8+9+10)。
求前n个正整数的约数个数之和也相似:
i=1∑nσ0(i)=i=1∑nd∣n∑1=d=1∑ni=1∑dn1=d=1∑n⌊dn⌋
如今咱们来加大一点难度,(51Nod 1239)求前
n个正整数的欧拉函数之和,即
Φ(n)=∑i=1nφ(i),其中
n≤1011。
对于
φ(i),咱们知道
∑d∣nφ(d)=n,即
(φ∗I)(n)=∑d∣nφ(d)I(dn)=∑d∣nφ(d)=n,则
2n⋅(n+1)=i=1∑ni=i=1∑n(φ∗I)(i)=i=1∑nd∣n∑σ(d)=i=1∑nd=1∑inσ(d)=i=1∑nΦ(⌊in⌋)
对于
∑i=1nΦ(⌊in⌋),若是
n=1则便是咱们要求的
Φ(n)。
则Φ(n)=i=1∑nΦ(⌊in⌋)−i=2∑nΦ(⌊in⌋)=2n⋅(n+1)−i=2∑nΦ(⌊in⌋)
因为
Φ(n)是一个积性函数的前缀和,因此筛法也能够预处理一部分。因此总复杂度为
O(n32)。
若是能经过狄利克雷卷积构造一个更好计算前缀和的函数,且用于卷积的另外一个函数也易计算,则能够简化计算过程。例如上题就是利用了
φ∗I=id的性质,但必定注意,不是全部的这一类题都只用配个恒等函数
I
就能够轻松完事的,有时须要更细致的观察。
(51Nod 1244)定义梅滕斯函数
M(n)=∑i=1nμ(i),给定正整数
n,计算
M(n),其中
n≤1011。能够利用
μ∗I=e的性质简化。
对于
μ(i),有
∑d∣nμ(d)=[n=1],则
(μ∗I)(n)=∑d∣nμ(d)I(dn)=[n=1],则
1=i=1∑n[i=1]=i=1∑n(μ∗I)(i)=i=1∑nd∣n∑μ(d)=i=1∑nd=1∑inμ(d)=i=1∑nM(⌊in⌋)同理得:M(n)=i=1∑nM(⌊in⌋)−i=2∑nM(⌊in⌋)=1−i=2∑nM(⌊in⌋)
同理复杂度为
O(n32)。
(51Nod 1237)定义最大公约数之和的函数
G(n)=∑i=1n∑j=1ngcd(i,j),给定正整数n,计算
G(n),其中
n≤1010。
方法1:G(n)=i=1∑nj=1∑ngcd(i,j)=i=1∑nj=1∑nd=1∑n[gcd(i,j)=d]⋅d=d=1∑ni=1∑dnj=1∑dn[gcd(i,j)=1]⋅d因为[gcd(i,j)=1]=k∣gcd(i,j)∑μ(k)则G(n)=d=1∑ni=1∑dnj=1∑dnk∣gcd(i,j)∑μ(k)⋅d=k=1∑nμ(k)d=1∑ndi=1∑kdnj=1∑kdn1=k=1∑nμ(k)d=1∑nd⋅⌊kdn⌋2令T=nk,则得T=1∑n⌊Tn⌋2d∣T∑d⋅μ(dT)再由n=id(n)=d∣n∑φ(d),则由莫比乌斯反演得φ(n)=d∣n∑id(d)⋅μ(dn)=d∣n∑d⋅μ(dn)则得T=1∑n⌊Tn⌋2φ(T),剩下就是求欧拉函数前缀和了。
方法2:G(n)=i=1∑nj=1∑ngcd(i,j)=i=1∑nj=1∑nd=1∑n[gcd(i,j)=d]⋅d=d=1∑ni=1∑dnj=1∑dn[gcd(i,j)=1]⋅dd=1∑ndi=1∑dnj=1∑dn[gcd(i,j)=1]=d=1∑nd((2i=1∑dnφ(i))−1),则剩下就是求欧拉函数前缀和了。对于i=1∑nj=1∑n[gcd(i,j)=1]=2i=1∑nj=1∑i[gcd(i,j)=1]−i=1∑n[gcd(i,i)=1]=(2i=1∑nφ(i))−1
(51Nod 1238)定义最小公倍数之和的函数
L(n)=∑i=1n∑j=1nlcm(i,j),给定正整数n,计算
L(n),其中
n≤1010
方法1:L(n)=i=1∑nj=1∑nlcm(i,j)=i=1∑nj=1∑ngcd(i,j)i⋅j=i=1∑nj=1∑nd=1∑n[gcd(i,j)=d]di⋅j=d=1∑ni=1∑dnj=1∑dn[gcd(i,j)=1]i⋅j⋅d=d=1∑ni=1∑dnj=1∑dnk∣gcd(i,j)∑μ(k)⋅i⋅j⋅d=d=1∑nk=1∑dni=1∑dknj=1∑dkni⋅j⋅d⋅μ(k)⋅k2=d=1∑ndk=1∑dnμ(k)⋅k2i=1∑dknij=1∑dknj=d=1∑ndk=1∑dnμ(k)⋅k2⋅4(⌊dkn⌋+1)2⋅⌊dkn⌋2然后就是求μ(k)⋅k2的前缀和,但是这个方法时间复杂度过高好像为O(n),此题不可行。后面有一道题要用此方法。
方法2:L(n)=i=1∑nj=1∑nlcm(i,j)=i=1∑nj=1∑ngcd(i,j)i⋅j=i=1∑nj=1∑nd=1∑n[gcd(i,j)=d]di⋅j=d=1∑ndi=1∑dnj=1∑dn[gcd(i,j)=1]i⋅j=d=1∑ndi=1∑dnij=1∑dn[gcd(i,j)=1]j因为i=1∑nij=1∑n[gcd(i,j)=1]⋅j=2i=1∑nij=1∑i[gcd(i,j)=1]⋅j−i=1∑n[gcd(i,i)=1]⋅i=(2i=1∑ni2i⋅φ(i)+[i=1])−1=(i=1∑ni2⋅φ(i)+[i=1])−1则得d=1∑nd((i=1∑dni2⋅φ(i)+[i=1])−1)=d=1∑ndi=1∑dni2⋅φ(i),然后就是求ϕ(n)=i=1∑ni2⋅φ(i)。令f(n)=n2⋅φ(n),则d∣n∑f∗(id)2(n)=d∣n∑d2⋅φ(d)⋅(dn)2=n2d∣n∑φ(d)=n3则4n2⋅(n+1)2=i=1∑ni3=i=1∑n(f∗id2)(i)=i=1∑nd∣i∑d2⋅φ(d)⋅(di)2=i=1∑ni2d=1∑ind2⋅φ(d)=i=1∑ni2⋅ϕ(in),则ϕ(n)=i=1∑ni2⋅ϕ(in)−i=2∑ni2⋅ϕ(in)=4n2⋅(n+1)2−i=1∑ni2⋅ϕ(in)最终得L(n)=d=1∑nd⋅ϕ(dn)
(Tsinsen A1231)定义最小公倍数之和的函数
L(n,m)=∑i=1n∑j=1mlcm(i,j),给定正整数n,m,计算
L(n,m),其中
n,m≤107