定義
如果一個數論函數\(f(n)\)滿足
則稱\(f(n)\)是一個積性函數。
特別的,如果不要求\(p\perp q\)且依然滿足上述式子的話,則稱\(f(n)\)是一個完全積性函數。
簡單約定
\((i,j)\)表示\(gcd(i,j)\)。
\([a]\)表示一個條件判斷函數,當\(a\)為真是\([a]=1\),否則\([a]=0\)。
\(i\perp j\)表示\((i,j)==1\)。
狄利克雷卷積懶得打括號了。
常見積性函數
至於它們為什么是積性函數,,,,
我也管不了那么多了。
狄利克雷卷積
定義
要計算的話可以把枚舉約數換成枚舉倍數(下面會講到),以調和級數\(O(nlogn)\)的復雜度求出\(f*g\)的前\(n\)項。
交換律
結合律
常見積性函數的卷積
這個需要特別說明一下。
假設\(n=p_1^{k_1}p_2^{k_2}\dots p_m^{k_m}\),那么上式可以改寫成:
觀察\(\mu(n)\)的定義,可以發現它與\(n\)的質因子個數有關,而且當某個質因子出現不止一次時,\(\mu(n)=0\)。這樣的話,只要\(c_1\)到\(c_n\)中有任意一個大於\(1\),后面那個\(\mu\)值就為\(0\)。
這樣的話,我們就可以大大降低枚舉范圍:
至於最后那個式子為什么是\([m=0]\),證法多種多樣,這里不再贅述。
那么繼續:
這個又是為什么?
直接證比較麻煩,我們利用\(\mu*1=e\)證一個反過來的式子:
直接暴力拆式子即可。要用到下面講到的一些技巧,可以回頭再來看。
這樣,我們就完成了上述積性函數的大一統:
反過來也可以:
莫比烏斯反演
類似於二項式反演和斯特林反演,有一個這樣的反演式子:
其實沒毛用,因為它的本質就是這樣的:
但這樣看的話,似乎就是廢話了。
常用推式子技巧
無關項提前
本質是分配律。
交換枚舉順序
這個看上去還是很\(naive\)。
比較重要的是枚舉約數變成枚舉倍數:
反演
就是活用上面那幾個常用積性函數的狄利克雷卷積關系式,尤其是\(\mu*1=e\)。
算法
數論分塊
這個居然在我很\(naive\)的時候自己\(yy\)出來了。
舉個例子,求\(\sum_{i=0}^n\lfloor\frac ni\rfloor,n\leq10^9\)。
不會的話打個表,然后就會了。
當\(n=100\)時,可以發現\(\lfloor\frac n{100}\rfloor,\lfloor\frac n{99}\rfloor,\dots,\lfloor\frac n{51}\rfloor\)都是\(1\),\(\lfloor\frac n{50}\rfloor,\lfloor\frac n{49}\rfloor,\dots,\lfloor\frac n{34}\rfloor\)都是\(2\),這樣的話,我們得到了一個可靠的結論:
\(\lfloor\frac n{\lfloor\frac ni\rfloor+1}\rfloor,\lfloor\frac n{\lfloor\frac ni\rfloor+2}\rfloor,\dots,\lfloor\frac n{\lfloor\frac n{i+1}\rfloor}\rfloor\)的結果都是\(i+1\)。
這樣我們就得到了一個快速的根號算法:
對於大於\(\sqrt n\)的數,不同的\(\lfloor\frac ni\rfloor\)只有\(\sqrt n\)個;
小於\(\sqrt n\)的數只有\(\sqrt n\)個,直接暴力算即可。
線性篩
這個比較簡單,只要我們探究出\(f(p^k)\)的表達式,就可以線性篩出所有\(f(i)\)。
杜教篩
假如我們要求\(s(n)=\sum_{i=1}^nf(i)\),如果我們能夠找到另一個函數\(g(n)\)使得\(g(n)\)和\(f*g(n)\)都比較好求,我們就可以利用杜教篩。
具體過程是這樣的:
當\(d=1\)時,\(s(\lfloor\frac nd\rfloor)\)就是\(s(n)\),所以有
這樣,如果我們能夠快速求出\(\sum_{i=1}^nf*g(i)\)和\(g(d)\),我們就可以對右邊數論分塊進行遞歸求解。我們可以用線性篩篩出前面一部分來優化復雜度。
復雜度是\(O(n^{\frac23})\),證明並不會,可以參考這個。
\(min\_25\)篩
不會。
留着坑吧,沒准哪天會了
不過也要退役了
應用
1、求\(\sum_{i=1}^n\sum_{j=1}^m[i\perp j],n,m\leq10^9\)。
需要用到的東西上面已經全部給出了。要注意\([i\perp j]\)其實就是\(e((i,j))\)。
數論分塊套上杜教篩求出\(\sum\mu(d)\)即可。
杜教篩\(\mu\)的話,令函數\(g\)為\(1\)函數,此時\(\sum_{i=1}^n\mu*1(i)=1\),\(1\)函數本身也沒有任何難度可言。
2、求\(\sum_{i=1}^n\sum_{j=1}^m(i,j),n,m\leq10^9\)。
同樣的,因為\((i,j)\)就是\(id((i,j))\),所以套用上一題做法即可。
杜教篩\(\varphi\)的話,我們同樣令\(g\)為\(1\)函數,此時\(\sum_{i=1}^n\varphi*1(i)=\frac{n(n+1)}2\)。
3、給出一個\(n*m\)的點陣,如果一對點連成的線段不經過其它點,那么稱這對點是合法的。求有多少合法的點對。
這是我原創的一道蠢題……做法就交給各位神仙了。
……
備注
給出一些可能用到的鏈接:
模板
例題
例題2(人生第一道紫題,自己yy出了一個\(O(n\sqrt n)\)的做法,現在看起來好\(low\)啊)
例題3(數據有誤)