1. 程式人生 > >[學習筆記]杜教篩法的原理

[學習筆記]杜教篩法的原理

一、引入

通常,在莫比烏斯反演的題目中會推出下面這樣的式子:
i=1nnif(i)\sum_{i=1}^n\lfloor\frac ni\rfloor f(i)
其中 ff 是積性函式。
我們知道,當 1in1\le i\le nni\lfloor\frac ni\rfloor 的取值只有 O(n)O(\sqrt n) 種。
於是我們可以對下界分塊,利用 ff 的字首和求解,從而實現一次 O(n)O(\sqrt n) 的複雜度。
但如果 n=109n=10^9 時,如何求 ff 的字首和呢?
下面就來介紹求積性函式字首和

的演算法:杜教篩。

二、前置芝士:狄利克雷 (Dirichlet) 卷積

兩個數論函式函式 ffgg 的狄利克雷卷積定義為:
(fg)(n)dnf(d)g(nd)(f*g)(n)\sum_{d|n}f(d)g(\frac nd)
如果 ffgg 為積性函式,那麼 fgf*g 也是積性函式。

三、演算法流程

設我們要求的值:
S(n)=i=1nf(i)S(n)=\sum_{i=1}^nf(i)
首先找到一個積性函式 gg ,使得
h(n)=i=1n(fg)(i)h(n)=\sum_{i=1}^n(f*g)(i)


可以被 O(1)O(1) 計算出, g(n)g(n)值及字首和也能被 O(1)O(1) 計算出。
於是有:
i=1ndif(id)g(d)=h(n)\sum_{i=1}^n\sum_{d|i}f(\frac id)g(d)=h(n)
把列舉約數改成列舉倍數:
d=1ng(d)1in,dif(id)=h(n)\sum_{d=1}^ng(d)\sum_{1\le i\le n,d|i}f(\frac id)=h(n)
滿足所有 1in,di1\le i\le n,d|iid\frac id 實際上就是所有滿足 1ind1\le i\le\lfloor\frac nd\rfloorii
i=1ng(i)j=1nif(j)=h(n)\sum_{i=1}^ng(i)\sum_{j=1}^{\lfloor\frac ni\rfloor}f(j)=h(n)
於是:
i=1ng(i)S(ni)=h(n)\sum_{i=1}^ng(i)S(\lfloor\frac ni\rfloor)=h(n)
由於 n1=n\lfloor\frac n1\rfloor=n ,故:
g(1)S(n)=h(n)i=2ng(i)S(ni)g(1)S(n)=h(n)-\sum_{i=2}^ng(i)S(\lfloor\frac ni\rfloor)
ni\lfloor\frac ni\rfloor 下界分塊。使用記憶化搜尋就能在 O(n34)O(n^{\frac 34}) 內求出一個字首和。
為了提高效率,我們還需要結合線性篩,篩出 n23n^{\frac 23} 內的所有 SS 值。
這樣,我們實現了 O(n23)O(n^{\frac 23})S(n)S(n)

四、複雜度分析

S(n)S(n) 時由於使用了記憶化,所以會遞迴到的值 xx 一定是 ni\lfloor\frac ni\rfloor 的取值(最多 O(n)O(\sqrt n) 種)。
所以複雜度(不結合線性篩的情況下):
i=1ni+i=1nni\sum_{i=1}^{\sqrt n}\sqrt i+\sum_{i=1}^{\sqrt n}\sqrt{\frac ni}
=0n(x+nx)dx=O(n34)=\int_0^{\sqrt n}(\sqrt x+\sqrt{\frac nx})\text{d}x=O(n^{\frac 34})
如果結合了線性篩,那麼能遞迴到的 xx 至少 n23n^{\frac 23}
複雜度降到:
i=1n13ni=0n13nxdx=O(n23)\sum_{i=1}^{n^{\frac 13}}\sqrt{\frac ni}=\int_0^{n^{\frac 13}}\sqrt{\frac nx}\text{d}x=O(n^{\frac 23})

五、有趣的栗子

來源: BZOJ 3944
https://www.lydsy.com/JudgeOnline/problem.php?id=3944
(1)求 i=1nμ(i)\sum_{i=1}^n\mu(i)
我們知道, μ1=e\mu*1=eee 為單位元,即 [n=1][n=1]
於是:
i=1nμ(i)=1i=2nj=1niμ(j)\sum_{i=1}^n\mu(i)=1-\sum_{i=2}^n\sum_{j=1}^{\lfloor\frac ni\rfloor}\mu(j)

相關推薦

[學習筆記]原理

一、引入 通常,在莫比烏斯反演的題目中會推出下面這樣的式子: ∑i=1n⌊ni⌋f(i)\sum_{i=1}^n\lfloor\frac ni\rfloor f(i)i=1∑n​⌊in​⌋f(i) 其中 fff 是積性函式。 我們知道,當 1≤i≤n1\le i

[學習筆記]

mit 記憶 text 快速查找 floor 相等 sqrt limit 原因 幾十天前學的這玩意吧...比Min_25篩好理解多了... 式子挺容易推的, 放在這裏以備快速查找吧 設我們要計算的是 $S(n)=\sum\limits_{k=1}^nf(k)$, 其中

[學習筆記]

函數 list gym 前綴 形式 公式 tar png 構造 入門好博客: 杜教篩 - pengym - 博客園 求一些方便構造卷積形式的積性函數的前綴和(不是積性函數如果可以變成卷積形式也可以做) 構造h=f*g,然後推h的前綴和,就可以把f前綴和遞歸處理

胡小兔的學習筆記

求解 init 了解 define esp spa warning 它的 prime 好久沒寫數論題,今天在51nod抓了一道,發現自己早就把杜教篩忘得一幹二凈啦~ 所以今天我把杜教篩學習筆記整理一下,防止以後再次忘記 =v= [Warning] 杜教篩復雜度證明我暫時還不

莫比烏斯反演 狄利克雷卷積 學習筆記

前置知識:一些數論函式,比如尤拉函式、莫比烏斯函式的一些性質,積性函式及性質,整除分塊。 這裡預設大家會前置知識,如果不會請自行學習。 之前嘗試看過,結果後來都忘光了,於是還是決定應該寫個學習筆記記錄一下。 首先開始介紹莫比烏斯反演。 我們設

學習筆記

sso span 形式 dig queue fontsize 只需要 tps tro QwQ一個不會莫比烏斯反演的蒟蒻來寫杜教篩的博客了 這個是杜教篩的一般形式 中間那個先枚舉幾倍,實際上相當於把令\(i=k*d\) 然後進行k和d枚舉 這麽空說怎麽好理解 我們來引入兩

數論學習筆記 尤拉函式 (一些性質和運用)內建

定義 在數論中,對正整數n,尤拉函式是小於等於n的數中與n互質的數的數目。並且用符號φ(n)表示一個整數的尤拉函式。例如φ(8)=4。特殊的φ(1)=1。 一些尤拉函式的性質 性質一 對於一個質數n,φ(n)=n−1。 證明: 因為n是質數。

瞎推 學習筆記】【數學】

空間 ^c turn 感覺 rac blog 預處理 查詢 前綴 杜教篩瞎推【學習筆記】 〇、前言 對於 bzoj3944 來說,和莫比烏斯反演等其他知識關系不大,但是 \(\mu\) 函數在自變量較大情況下的前綴和在反演題中也是會被用到的。 接下來通過 bzoj3944

埃氏+線性++min25總結

埃氏篩法 這個篩法是最樸素的篩法了,可以在 O(nloglogn) O ( n l o

3944: Sum[]

sizeof desc sta name check const sub bmi discus 3944: Sum Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3471 Solved: 946[Submit][St

進階+洲閣講解+SPOJ divcnt3

前綴 con bre sca else rac poj class algo Part 1:杜教篩進階在了解了杜教篩基本應用,如$\sum_{i=1}^n\varphi(i)$的求法後,我們看一些杜教篩較難的應用。求$\sum_{i=1}^n\varphi(i)*i$考慮把

【bzoj4176】Lucas的數論 莫比烏斯反演+

wid eight 前綴 .html != brush name load ans 題目描述 去年的Lucas非常喜歡數論題,但是一年以後的Lucas卻不那麽喜歡了。 在整理以前的試題時,發現了這樣一道題目“求Sigma(f(i)),其中1<=i<

【BZOJ3944/4805】Sum/歐拉函數求和

width pri define second pair ring 空格 string pll 【BZOJ3944】Sum Description Input 一共T+1行 第1行為數據組數T(T<=10) 第2~T+1行每行一個非負整數N,代表一組

Andrew Ng機器學習筆記+Weka相關算實現(四)SVM和原始對偶問題

優化問題 坐標 出了 變量 addclass fun ber 找到 線性 這篇博客主要解說了Ng的課第六、七個視頻,涉及到的內容包含,函數間隔和幾何間隔、最優間隔分類器 ( Optimal Margin Classifier)、原始/對偶問題 ( Pr

Python學習筆記19(算

while bdc bubble == append 算法 ef7 -a += 1.二分查找 只能用二分查找查找有序列表 def bin_search(data,val): #data為被查找的列表,val是要查找的值 low = 0 high = l

【bzoj 4176】 Lucas的數論 莫比烏斯反演(

amp short last ++ esc output sig blog tro Description 去年的Lucas非常喜歡數論題,但是一年以後的Lucas卻不那麽喜歡了。 在整理以前的試題時,發現了這樣一道題目“求Sigma(f(i)),其中1&l

狄利克雷卷積&&&&莫比烏斯反演

pos cnblogs title tar sdn aid www. article 前綴 狄利克雷卷積和莫比烏斯反演:鏈接 淺談一類積性函數的前綴和: 鏈接 賈誌鵬線性篩: 鏈接   讀賈誌鵬線性篩有感 (莫比烏斯函數的應用)   莫比烏斯函數 狄利

《機器學習實戰》學習筆記——k近鄰算

eating 元組 切片 文件 維度 mage python str eric 1.numpy中一些函數的用法學習 shape()用法: shape : tuple of ints The elements of the shape tuple give the le

bzoj 4176: Lucas的數論 -- ,莫比烏斯反演

i++ define hint .net width long .com cas string 4176: Lucas的數論 Time Limit: 30 Sec Memory Limit: 256 MB Description 去年的Lucas非常喜歡數論

bzoj 4916: 神犇和蒟蒻【歐拉函數+莫比烏斯函數+

pac pan using 函數 莫比烏斯函數 right for body ace 居然扒到了學長出的題 和3944差不多(?),雖然一眼看上去很可怕但是仔細觀察發現,對於mu來講,答案永遠是1(對於帶平方的,mu值為0,1除外),然後根據歐拉篩的原理,\( \sum_{