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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【专题】莫比乌斯反演

發(fā)布時間:2024/3/12 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【专题】莫比乌斯反演 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

問題引入:

給定整數(shù) N 和 M。求滿足??且??為質(zhì)數(shù)的點(diǎn)對??的個數(shù)。

數(shù)據(jù)范圍:

?

接下來會見到以下內(nèi)容:

  • 莫比烏斯函數(shù)
  • 莫比烏斯函數(shù)的線性篩
  • 迪利克雷卷積介紹
  • 莫比烏斯反演
  • 整除分塊
  • 杜教篩介紹

?

莫比烏斯函數(shù):

這里 else 是指:n有大于1的平方因子的情況,如,4、9、16等。

?

莫比烏斯函數(shù)的線性篩:

其實(shí),莫比烏斯函數(shù)線性篩與普通的線性篩基本相同,只是多了一個 mu[MAXN] 數(shù)組罷了。

int prime[MAXN], prime_tot;//prime[MAXN]用于保存質(zhì)數(shù),prime_tot是質(zhì)數(shù)的個數(shù); bool prime_tag[MAXN];//標(biāo)記是否為質(zhì)數(shù),false表示是質(zhì)數(shù),true表示合數(shù); int mu[MAXN];//保存n的莫比烏斯函數(shù)值; void pre_calc(int lim){mu[1] = 1;for (int i = 2; i <= lim; ++i) {if(!prime_tag[i]) {prime[++prime_tot] = i;mu[i] = -1;//質(zhì)數(shù)的莫比烏斯函數(shù)值必為-1; }for (int j = 1; j <= prime_tot; ++j) {if(i * prime[j] > lim)break;prime_tag[i * prime[j] ] = true;//質(zhì)數(shù)的倍數(shù)必是合數(shù) if(i % prime[j] == 0) {//如果 i能被質(zhì)數(shù)整除 說明 i中必有同一個質(zhì)數(shù)因子//那么 i*prime[j] 就必有平方因子 mu[i * prime[j] ] = 0;break;}else {mu[i * prime[j] ] = -mu[i];}}} }

?

狄利克雷卷積介紹:

狄利克雷卷積是函數(shù)之間的運(yùn)算

狄利克雷卷積:。

積性函數(shù):對于任意互質(zhì)的整數(shù) a和b 有性質(zhì)?的函數(shù)。

完全積性函數(shù):對于任意整數(shù) a和b 有性質(zhì)?的函數(shù)。

?

證明:

設(shè) n 不同的因子的個數(shù)為 k,則有

由二項(xiàng)式定理展開,得

令 x = -1,y = 1,代入得

?

下面是一些常見的積性函數(shù):

①歐拉函數(shù)?

歐拉函數(shù)是求??的質(zhì)數(shù)的個數(shù)。

?

②莫比烏斯函數(shù)?

本節(jié)所講函數(shù)。

?

③單位函數(shù)?

n 是多少就是多少。

?

④不變函數(shù)?

恒等于 1。

?

⑤冪函數(shù)?

易知,。

?

⑥因子個數(shù)函數(shù)?(注意,這里是指不變函數(shù)相乘)

?

⑦因子和函數(shù)?

?

⑧因子函數(shù)?

?

⑨狄利克雷卷積單位元?

?

其中,①②⑨是比較重要的函數(shù)。

(注意:這里的??是指做卷積)

?

莫比烏斯反演:

公式一:

?

公式二:

(數(shù)論千萬條,反演第一條。反演不會做,隊(duì)友兩行淚。)

兩條公式的差別:一條是印數(shù)關(guān)系,一條是倍數(shù)關(guān)系。

?

公式一證明:

?

是不是特別簡單?

可是,為什么??會消去?

答案是,不變函數(shù)是莫比烏斯函數(shù)的乘法逆元。

還不知道什么是乘法逆元的,可以先去學(xué)習(xí)一下。

?

公式二證明:

令?,則

?

想一想,為什么第三條式子可以變?yōu)榈谒臈l式子呢?

因?yàn)?#xff0c;當(dāng)且僅當(dāng) (nk|t) 成立的時候,才會對求和有貢獻(xiàn)。

?

那么,第四條式子又是怎么去到第五條式子的呢?

仔細(xì)看看,?是不是成立?那么,也就出來了。

?

最后,根據(jù)狄利克雷卷積單位元的性質(zhì),當(dāng)且僅當(dāng) t?= n?,即??時才會有貢獻(xiàn),證畢。

?

回歸問題:

?

?

求?,p是質(zhì)數(shù)。

?

定義,

?

那么,?且有?.。

?

下面開始反演:

?

到這里,復(fù)雜度已經(jīng)降下來一些了,那么怎么解決左邊的這一塊呢?

?

我們預(yù)處理一個?。

for (int i = 1; i <= prime_tot; ++i) {for (int j = 1; prime[i] * j <= lim; ++j) {sum[prime[i] * j] += mu[j];} }

?

最終,?。

?

整除分塊:

?約有??個可能值。

如,N = 25,k = 1,2,3,4,5,6,7-8,9-12,13-25時,?共有 9 個互不相同的值。

快速計(jì)算的方法:

for (int l = 1, r; i <= N; l = r + 1) {r = N / (N / l);ans += (r - l + 1) * (N / l); }

?

杜教篩:

有些題目要用到前綴和,但是數(shù)據(jù)范圍會很大,這是要用到杜教篩。

例如,求?

?

定義:

int mu_sum[MAXN]; unordered_map<long long, int> mp; int mu_calc (long long n) {if (n < lim) return mu_sum[n];if (mp.count(n)) return mp[n];int ret = 1;for (long long l = 2, r; l <= n; l = r +1) {r = n / (n / l);ret -= (r - l + 1) * mu_calc(n / l);}return mp[n] = ret; }

當(dāng)然,杜教篩還可以應(yīng)用到更多地方。

?

本文章學(xué)習(xí)來自:

【算法講堂】【電子科技大學(xué)】【ACM】莫比烏斯反演

?

題目練習(xí):

待補(bǔ)充。。

總結(jié)

以上是生活随笔為你收集整理的【专题】莫比乌斯反演的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。