日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

杜教筛入门详解

發布時間:2023/12/4 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 杜教筛入门详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

杜教篩入門

前置知識

迪利克雷卷積(*):

先介紹三個重要的函數:

  • 元函數?(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}ozvdkddzhkzd) = \epsilon(1)f(n) = f(n)(??f)(n)=dn??(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}ozvdkddzhkzd)(f?g)(n)=dn?f(d)g(dn?)

并且這個式子是滿足:交換律,結合律,分配律的。

與莫比烏斯函數有關的卷積:

∑d∣nμ(d)=[n==1]\sum_{d \mid n} \mu(d) = [n == 1]dn?μ(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) = ndn??(d)=n

寫成卷積就是(I??)(n)=id(n)(I * \phi)(n) = id(n)(I??)(n)=id(n)

正式開始了

所謂杜教篩就是可以在n23n ^ \frac{2}{3}n32?的時間復雜度內算出積性函數的淺醉和來,所以當數據≥1e8\geq 1e81e8的時候就只能用杜教篩了。

假設有積性函數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=1n?f(i)n1e10

根據迪利克雷卷積,我們引入一個新的積性函數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}ozvdkddzhkzd)\\ = \sum_{d = 1} ^{n} g(d) \sum_{d \mid i} f(\frac{i}ozvdkddzhkzd) = \sum_{d = 1} ^{n} g(d) \sum_{i = 1} ^{\frac{n}ozvdkddzhkzd}f(i)\\ = \sum_{d = 1} ^{n} g(d) S(\frac{n}ozvdkddzhkzd)\\ i=1n?F(i)=i=1n?(g?f)(i)=i=1n?di?g(d)f(di?)=d=1n?g(d)di?f(di?)=d=1n?g(d)i=1dn??f(i)=d=1n?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}ozvdkddzhkzd)i=1n?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}ozvdkddzhkzd)S(n)=i=1n?F(i)?d=2n?g(d)S(dn?)

如果我們能夠較快速的計算出∑i=1n(g?f)(i)\sum\limits_{i = 1} ^{n} (g * f)(i)i=1n?(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=1n?μ(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}ozvdkddzhkzd)S(n)=i=1n?g?μ?d=2n?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}ozvdkddzhkzd) = 1 - \sum\limits_{d = 2} ^{n} S(\frac{n}ozvdkddzhkzd)S(n)=i=1n???d=2n?S(dn?)=1?d=2n?S(dn?)

于是我們就完美解決了這個問題。

二、求S(n)=∑i=1niμ(i)S(n) = \sum\limits_{i = 1} ^{n} i \mu(i)S(n)=i=1n?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}ozvdkddzhkzd)S(n)=i=1n?g?μ?id?d=2n?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}ozvdkddzhkzd)S(n)=i=1n?i?d=2n?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}ozvdkddzhkzd) = \sum_{d \mid n} d \mu(d) g(\frac{n}ozvdkddzhkzd)g?f=dn?f(d)g(dn?)=dn?dμ(d)g(dn?)

容易想到∑d∣nμ(d)=[n==1]\sum_{d \mid n} \mu(d) = [n == 1]dn?μ(d)=[n==1],所以從這點出發我們考慮dg(nd)μ(d)d g(\frac{n}ozvdkddzhkzd) \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}ozvdkddzhkzd) \mu(d) = d \frac{n}ozvdkddzhkzd \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}ozvdkddzhkzd) = \sum\limits_{i = 1} ^{n} i\sum\limits_{d \mid i}\mu(d) - \sum\limits_{d = 2} ^{n}d S(\frac{n}ozvdkddzhkzd) = \sum\limits_{i = 1} ^{n} i(i == 1) - \sum\limits_{d = 2} ^{n}d S(\frac{n}ozvdkddzhkzd)S(n)=i=1n?di?iμ(d)?d=2n?dS(dn?)=i=1n?idi?μ(d)?d=2n?dS(dn?)=i=1n?i(i==1)?d=2n?dS(dn?)

由此我們成功推出S(n)=1?∑d=2ndS(nd)S(n) = 1 - \sum\limits_{d = 2} ^{n} d S(\frac{n}ozvdkddzhkzd)S(n)=1?d=2n?dS(dn?)

三、求S(n)=∑i=1n?(i)S(n) = \sum\limits_{i = 1} ^{n} \phi(i)S(n)=i=1n??(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}ozvdkddzhkzd)S(n)=i=1n?g?phi?d=2n?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}ozvdkddzhkzd)S(n)=i=1n?i?d=2n?S(dn?)

就直接推出來了。

四、求S(n)=∑i=1ni?(i)S(n) = \sum\limits_{i = 1} ^{n} i \phi(i)S(n)=i=1n?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}ozvdkddzhkzd) = \sum_{d \mid n} d \phi(d) g(\frac{n}ozvdkddzhkzd)f?g=dn?f(d)g(dn?)=dn?d?(d)g(dn?)

同樣聯想∑d∣n?(d)=n\sum_{d \mid n} \phi(d) = ndn??(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=dn?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}ozvdkddzhkzd) = S(n) = \sum\limits_{i = 1} ^{n} i ^ 2 - \sum\limits_{d = 2} ^{n}dS(\frac{n}ozvdkddzhkzd)S(n)=i=1n?idi??(d)?d=2n?dS(dn?)=S(n)=i=1n?i2?d=2n?dS(dn?)

總結

以上是生活随笔為你收集整理的杜教筛入门详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。