積性函數前綴和-我的總結
【寫在前面】
用了一個多星期將這部分大體弄懂了,東西太多,有不少技巧,本身從新寫了一下,記錄本身的理解。內容與原文基本一致,在其基礎上加上了一些我感受比較重要的但他沒有詳細說明的東西。如下都是我逐字打出來的。若是有什麼錯誤,請指出。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