杜教筛入门详解
杜教篩入門
前置知識
迪利克雷卷積(*):
先介紹三個重要的函數:
-
元函數?(n)=[n==1]\epsilon(n) = [n == 1]?(n)=[n==1]
原函數可以看成是迪利克雷卷積里的單位元,即(??f)(n)=f(n)(\epsilon * f)(n) = f(n)(??f)(n)=f(n),
證明:(??f)(n)=∑d∣n?(d)f(nd)=?(1)f(n)=f(n)(\epsilon * f)(n) = \sum_{d \mid n} \epsilon(d) f(\frac{n}ze8trgl8bvbq) = \epsilon(1)f(n) = f(n)(??f)(n)=∑d∣n??(d)f(dn?)=?(1)f(n)=f(n)
-
恒等函數I(n)=1I(n) = 1I(n)=1,通俗來講就是其值恒為1
-
單位函數id(n)=nid(n) = nid(n)=n
卷積的定義:(f?g)(n)=∑d∣nf(d)g(nd)(f*g)(n) = \sum_{d \mid n} f(d)g(\frac{n}ze8trgl8bvbq)(f?g)(n)=∑d∣n?f(d)g(dn?)
并且這個式子是滿足:交換律,結合律,分配律的。
與莫比烏斯函數有關的卷積:
∑d∣nμ(d)=[n==1]\sum_{d \mid n} \mu(d) = [n == 1]∑d∣n?μ(d)=[n==1]
寫成卷積也就是(I?μ)(n)=?(n)=[n==1](I * \mu)(n) = \epsilon(n) = [n == 1](I?μ)(n)=?(n)=[n==1]。
與歐拉函數有關的卷積:
∑d∣n?(d)=n\sum_{d \mid n} \phi(d) = n∑d∣n??(d)=n
寫成卷積就是(I??)(n)=id(n)(I * \phi)(n) = id(n)(I??)(n)=id(n)。
正式開始了
所謂杜教篩就是可以在n23n ^ \frac{2}{3}n32?的時間復雜度內算出積性函數的淺醉和來,所以當數據≥1e8\geq 1e8≥1e8的時候就只能用杜教篩了。
假設有積性函數f(n)f(n)f(n),我們要求S(n)=∑i=1nf(i),n≤1e10S(n) = \sum\limits_{i = 1} ^{n}f(i),n \leq 1e10S(n)=i=1∑n?f(i),n≤1e10。
根據迪利克雷卷積,我們引入一個新的積性函數g(n)g(n)g(n),F(n)=(g?f)(n)F(n) = (g * f)(n)F(n)=(g?f)(n)
∑i=1nF(i)=∑i=1n(g?f)(i)=∑i=1n∑d∣ig(d)f(id)=∑d=1ng(d)∑d∣if(id)=∑d=1ng(d)∑i=1ndf(i)=∑d=1ng(d)S(nd)\sum_{i = 1} ^{n} F(i) = \sum_{i = 1} ^{n} (g * f)(i) = \sum_{i = 1} ^{n} \sum_{d \mid i} g(d)f(\frac{i}ze8trgl8bvbq)\\ = \sum_{d = 1} ^{n} g(d) \sum_{d \mid i} f(\frac{i}ze8trgl8bvbq) = \sum_{d = 1} ^{n} g(d) \sum_{i = 1} ^{\frac{n}ze8trgl8bvbq}f(i)\\ = \sum_{d = 1} ^{n} g(d) S(\frac{n}ze8trgl8bvbq)\\ i=1∑n?F(i)=i=1∑n?(g?f)(i)=i=1∑n?d∣i∑?g(d)f(di?)=d=1∑n?g(d)d∣i∑?f(di?)=d=1∑n?g(d)i=1∑dn??f(i)=d=1∑n?g(d)S(dn?)
所以有∑i=1nF(i)=g(1)S(n)+∑d=2ng(d)S(nd)\sum\limits_{i = 1} ^{n} F(i) = g(1)S(n) + \sum_{d = 2} ^{n} g(d) S(\frac{n}ze8trgl8bvbq)i=1∑n?F(i)=g(1)S(n)+∑d=2n?g(d)S(dn?)
積性函數的定義有g(1)=1g(1) = 1g(1)=1,所以接下來
S(n)=∑i=1nF(i)?∑d=2ng(d)S(nd)S(n) = \sum\limits_{i = 1} ^{n} F(i) - \sum\limits_{d = 2} ^{n}g(d)S(\frac{n}ze8trgl8bvbq)S(n)=i=1∑n?F(i)?d=2∑n?g(d)S(dn?)
如果我們能夠較快速的計算出∑i=1n(g?f)(i)\sum\limits_{i = 1} ^{n} (g * f)(i)i=1∑n?(g?f)(i)這個問題就可以通過數論分塊很好的解決了,當然在次之前我們還得預先篩選出前n23n ^{\frac{2}{3}}n32?的前綴和來,然后再通過記憶化搜索去得到答案。
幾個例子
一、求S(n)=∑i=1nμ(i)S(n) = \sum\limits_{i = 1} ^{n} \mu(i)S(n)=i=1∑n?μ(i)
我們先套用上面的式子S(n)=∑i=1ng?μ?∑d=2ng(d)S(nd)S(n) = \sum\limits_{i = 1} ^{n} g * \mu - \sum\limits_{d = 2} ^{n}g(d)S(\frac{n}ze8trgl8bvbq)S(n)=i=1∑n?g?μ?d=2∑n?g(d)S(dn?)
我們考慮到I?μ=?I * \mu = \epsilonI?μ=?,于是我們得到S(n)=∑i=1n??∑d=2nS(nd)=1?∑d=2nS(nd)S(n) = \sum\limits_{i = 1} ^{n}\epsilon - \sum\limits_{d = 2} ^{n} S(\frac{n}ze8trgl8bvbq) = 1 - \sum\limits_{d = 2} ^{n} S(\frac{n}ze8trgl8bvbq)S(n)=i=1∑n???d=2∑n?S(dn?)=1?d=2∑n?S(dn?)
于是我們就完美解決了這個問題。
二、求S(n)=∑i=1niμ(i)S(n) = \sum\limits_{i = 1} ^{n} i \mu(i)S(n)=i=1∑n?iμ(i)
上面式子按照套路模板寫下來S(n)=∑i=1ng?μ?id?∑d=2ng(d)S(nd)S(n) = \sum\limits_{i = 1} ^{n} g * \mu *id - \sum\limits_{d = 2} ^{n}g(d)S(\frac{n}ze8trgl8bvbq)S(n)=i=1∑n?g?μ?id?d=2∑n?g(d)S(dn?)
同樣的有μ?I=?,??id=id\mu * I = \epsilon,\epsilon *id = idμ?I=?,??id=id,
所以我們得到S(n)=∑i=1ni?∑d=2nS(nd)S(n) = \sum\limits_{i = 1} ^{n}i - \sum\limits_{d = 2} ^{n}S(\frac{n}ze8trgl8bvbq)S(n)=i=1∑n?i?d=2∑n?S(dn?)
貌似推得很有道理,所以我們錯在哪?
事實上我們模板都抄錯了iμ(i)i \mu(i)iμ(i)這東西顯然不是迪利克雷卷積,,,
我們設f(n)=nμ(n)f(n) = n \mu(n)f(n)=nμ(n),所以g?f=∑d∣nf(d)g(nd)=∑d∣ndμ(d)g(nd)g * f = \sum_{d \mid n} f(d) g(\frac{n}ze8trgl8bvbq) = \sum_{d \mid n} d \mu(d) g(\frac{n}ze8trgl8bvbq)g?f=∑d∣n?f(d)g(dn?)=∑d∣n?dμ(d)g(dn?)
容易想到∑d∣nμ(d)=[n==1]\sum_{d \mid n} \mu(d) = [n == 1]∑d∣n?μ(d)=[n==1],所以從這點出發我們考慮dg(nd)μ(d)d g(\frac{n}ze8trgl8bvbq) \mu(d)dg(dn?)μ(d)如何得到含有μ(d)\mu(d)μ(d)的形式。
顯然,通過觀察如果我們讓g(n)=ng(n) = ng(n)=n,上式就有dg(nd)μ(d)=dndμ(d)=nμ(d)d g(\frac{n}ze8trgl8bvbq) \mu(d) = d \frac{n}ze8trgl8bvbq \mu(d) = n\mu(d)dg(dn?)μ(d)=ddn?μ(d)=nμ(d)
帶入原式子就變成了S(n)=∑i=1n∑d∣iiμ(d)?∑d=2ndS(nd)=∑i=1ni∑d∣iμ(d)?∑d=2ndS(nd)=∑i=1ni(i==1)?∑d=2ndS(nd)S(n) = \sum\limits_{i = 1} ^{n} \sum\limits_{d \mid i}i \mu(d) - \sum\limits_{d = 2} ^{n}d S(\frac{n}ze8trgl8bvbq) = \sum\limits_{i = 1} ^{n} i\sum\limits_{d \mid i}\mu(d) - \sum\limits_{d = 2} ^{n}d S(\frac{n}ze8trgl8bvbq) = \sum\limits_{i = 1} ^{n} i(i == 1) - \sum\limits_{d = 2} ^{n}d S(\frac{n}ze8trgl8bvbq)S(n)=i=1∑n?d∣i∑?iμ(d)?d=2∑n?dS(dn?)=i=1∑n?id∣i∑?μ(d)?d=2∑n?dS(dn?)=i=1∑n?i(i==1)?d=2∑n?dS(dn?)
由此我們成功推出S(n)=1?∑d=2ndS(nd)S(n) = 1 - \sum\limits_{d = 2} ^{n} d S(\frac{n}ze8trgl8bvbq)S(n)=1?d=2∑n?dS(dn?)。
三、求S(n)=∑i=1n?(i)S(n) = \sum\limits_{i = 1} ^{n} \phi(i)S(n)=i=1∑n??(i)
直接套就行了這個S(n)=∑i=1ng?phi?∑d=2ng(d)S(nd)S(n) = \sum\limits_{i = 1} ^{n} g * phi - \sum\limits_{d = 2} ^{n}g(d)S(\frac{n}ze8trgl8bvbq)S(n)=i=1∑n?g?phi?d=2∑n?g(d)S(dn?)
有I??=idI * \phi = idI??=id,所以S(n)=∑i=1ni?∑d=2nS(nd)S(n) = \sum\limits_{i = 1} ^{n} i - \sum\limits_{d = 2} ^{n}S(\frac{n}ze8trgl8bvbq)S(n)=i=1∑n?i?d=2∑n?S(dn?)
就直接推出來了。
四、求S(n)=∑i=1ni?(i)S(n) = \sum\limits_{i = 1} ^{n} i \phi(i)S(n)=i=1∑n?i?(i)
仿照二先推出一個ggg出來,
f?g=∑d∣nf(d)g(nd)=∑d∣nd?(d)g(nd)f * g = \sum_{d \mid n} f(d) g(\frac{n}ze8trgl8bvbq) = \sum_{d \mid n} d \phi(d) g(\frac{n}ze8trgl8bvbq)f?g=∑d∣n?f(d)g(dn?)=∑d∣n?d?(d)g(dn?)
同樣聯想∑d∣n?(d)=n\sum_{d \mid n} \phi(d) = n∑d∣n??(d)=n,所以我們同樣地取g(n)=n=idg(n) = n = idg(n)=n=id
就有f?g=∑d∣nn?(d)f * g = \sum_{d \mid n} n \phi(d)f?g=∑d∣n?n?(d)
帶入杜教篩式子就有S(n)=∑i=1ni∑d∣i?(d)?∑d=2ndS(nd)=S(n)=∑i=1ni2?∑d=2ndS(nd)S(n) = \sum\limits_{i = 1} ^{n} i \sum\limits_{d \mid i} \phi(d) - \sum\limits_{d = 2} ^{n}dS(\frac{n}ze8trgl8bvbq) = S(n) = \sum\limits_{i = 1} ^{n} i ^ 2 - \sum\limits_{d = 2} ^{n}dS(\frac{n}ze8trgl8bvbq)S(n)=i=1∑n?id∣i∑??(d)?d=2∑n?dS(dn?)=S(n)=i=1∑n?i2?d=2∑n?dS(dn?)
總結
- 上一篇: HDU 4059 The Boss on
- 下一篇: 维生素b12功能与作用