【算法專題】積性函數

【參考】html

淺談一類積性函數的前綴和 by skywalkert數組

任之洲數論函數.pdfapp

論逗逼的自我修養之寒假頹廢記 by jiry_2函數

杜教篩 [學習筆記]【更新中】 by Candy?post

 

【變化技巧總結】學習

總結下面全部知識含有的變化技巧優化

1.先枚舉gcd值。spa

2.莫比烏斯反演處理gcd,[gcd(x,y)=1]=Σd|i^d|jμ(d),而後將d提到最前面。.net

3.★分塊取值優化,ans=Σf(d)*g(n/d),其中g(n/d)只有2√n種取值,預處理f(d)的前綴和便可O(√n)。htm

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}})$。(這暫時不太清楚)