Learning:數論(四)莫比烏斯反演(+題集)

莫比烏斯函數的定義:

μ(x)={1,n=1(1)k,n=p1p2...pkp1,p2,...,pk0,\mu(x)=\begin{cases} 1,n=1\\ (-1)^k,n=p_1p_2...p_k,其中p_1,p_2,...,p_k爲互不相同的素數\\ 0,其他情況 \end{cases}
自己稍微推一推就可以知道這是一個積性函數。
所以很顯然我們可以線性篩μ\mu
由定義得:
μ(1)=1\mu(1)=1
μ(p)=1\mu(p)=-1
μ(pk)=0(k>1)\mu(p^k)=0(k>1)
所以就可以直接篩了,代碼如下:

void init(){
    mu[1]=1;
    for(int i=2;i<N;i++){
        if(!vis[i]){
            prm[cnt++]=i;
            mu[i]=-1;
        }
        for(int j=1;j<cnt&&i*prm[j]<N;j++){
            vis[i*prm[j]]=1;
            if(!(i%prm[j])){
                mu[i*prm[j]]=0;
                break;
            }
            mu[i*prm[j]]=-mu[i];
        }
    }
    return;
}

莫比烏斯反演

莫比烏斯反演有一個非常非常非常重要的性質
dnμ(d)=[n=1]\sum_{d|n}\mu(d)=[n=1]
怎麼證?
我們設n=i=1kpiαin=\prod_{i=1}^kp_i^{\alpha_i}
考慮nn的所有因數,他們的素因子都是p0,p1,...,pk1p_0,p_1,...,p_{k-1}中的,而我們會發現只有當因數的所有的素因子次數爲11時對答案的貢獻纔不爲00,所以我們可以認爲nn的每個對答案的貢獻不爲00因數都是在p0,p1,...,pk1p_0,p_1,...,p_{k-1}中取若干個素數相乘得到的。特殊的,因數1我們可以當做一個素數都不取。
n=1n=1時,顯然=1原式=1
n&gt;1n&gt;1時,
kk爲奇數,
首先易證Cnm=CnnmC_n^m=C_n^{n-m}
選奇數個素數相乘得到的因數個數爲Ck1+Ck3+...+CkkC_k^1+C_k^3+...+C_k^k,這種因數的函數值爲1-1
選偶數個素數相乘得到的因數個數爲Ck0+Ck2+...+Ckk1C_k^0+C_k^2+...+C_k^{k-1},這種因數的函數值爲11
首先顯然Cnm=CnnmC_n^m=C_n^{n-m}
所以易證Ck1+Ck3+...+Ckk=Ck0+Ck2+...+Ckk1C_k^1+C_k^3+...+C_k^k=C_k^0+C_k^2+...+C_k^{k-1},所以因數的函數值加起來爲00
kk爲偶數,
選奇數個素數相乘得到的因數個數爲Ck1+Ck3+...+Ckk1C_k^1+C_k^3+...+C_k^{k-1},這種因數的函數值爲1-1
選偶數個素數相乘得到的因數個數爲Ck0+Ck2+...+CkkC_k^0+C_k^2+...+C_k^k,這種因數的函數值爲11
首先顯然Cnm=Cn1m1+Cn1m(m̸=0),Cn0=Cn10C_n^m=C_{n-1}^{m-1}+C_{n-1}^{m}(m\not=0),C_n^0=C_{n-1}^0
所以Ck0+Ck2+...+Ckk=Ck10+Ck11+Ck12+...+Ck1k2+Ck1k1=2k1C_k^0+C_k^2+...+C_k^k=C_{k-1}^0+C_{k-1}^1+C_{k-1}^2+...+C_{k-1}^{k-2}+C_{k-1}^{k-1}=2^{k-1}
Ck1+Ck3+...+Ckk1=Ck1+Ck2+Ck3+...+Ckk(Ck0+Ck2+...+Ckk)C_k^1+C_k^3+...+C_k^{k-1}=C_k^1+C_k^2+C_k^3+...+C_k^k-(C_k^0+C_k^2+...+C_k^k)
=2k(Ck0+Ck2+...Ckk)=2k2k1=2k1=Ck0+Ck2+...Ckk=2^k-(C_k^0+C_k^2+...C_k^k)=2^k-2^{k-1}=2^{k-1}=C_k^0+C_k^2+...C_k^k
所以因數的函數值加起來爲00
綜上,dnμ(d)=[n=1]\sum_{d|n}\mu(d)=[n=1]

這個性質有多重要,我們接下來看一道題(前置知識:數論分塊):
t(1t10000)t(1\leq t\leq10000)組數據,每組數據給定n,m,(1nm107)n,m,(1\leq n\leq m\leq10^7)i=1nj=1m[gcd(i,j)=1]\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=1]
O(nm)秒了
我們會發現暴力的時間複雜度是O(nm)O(nm),顯然會TLE,所以我們考慮優化。
[gcd(i,j)=1][gcd(i,j)=1]這個式子很神奇?所以就從這裏入手。
仔細分析就會發現[gcd(i,j)=1]=dgcd(i,j)μ(d)[gcd(i,j)=1]=\sum_{d|gcd(i,j)}\mu(d),因爲由前面的莫比烏斯函數的性質可得當且僅當gcd(i,j)=1gcd(i,j)=1時,dgcd(i,j)μ(d)\sum_{d|gcd(i,j)}\mu(d)纔會等於11,否則等於00
所以原式就可以變成:i=1nj=1mdgcd(i,j)μ(d)\sum_{i=1}^n\sum_{j=1}^m\sum_{d|gcd(i,j)}\mu(d)
然後枚舉dd,此時i,ji,j就是dd的倍數,所以小於nnii就有nd\lfloor\frac{n}{d}\rfloor個,jj同理。所以我們就可以輕鬆得到:d=1nndmdμ(d)\sum_{d=1}^n\lfloor\frac{n}{d}\rfloor\lfloor\frac{m}{d}\rfloor\mu(d)
線性篩出μ\mu的前綴和,然後數論分塊O(n+m)O(\sqrt{n}+\sqrt{m})求解。
這就是莫比烏斯反演(其實有個公式的,但是用這個公式大部分題目都很難推,所以不如直接用莫比烏斯函數的性質來搞)
莫比烏斯反演只有多推才能熟練,所以
我們繼續!

t(1t10000)t(1\leq t\leq10000)組數據,每組數據給定n,m,k(1nm107)n,m,k(1\leq n\leq m\leq10^7).求:i=1nj=1m[gcd(i,j)=k]\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=k](HDU1695數據範圍稍有增加)
咋一看和剛剛的怎麼長得那麼像?
我們會發現只有當i,ji,j都是kk的倍數時,且gcd(ik,jk)=1gcd(\frac{i}{k},\frac{j}{k})=1時才能成立
所以原式轉化爲i=1nki=1mk[gcd(i,j)=1]\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}\sum_{i=1}^{\lfloor\frac{m}{k}\rfloor}[gcd(i,j)=1]
這不就轉化爲原來的那道題了嗎?得到原式等於d=1nkndkmdkμ(d)\sum_{d=1}^{\lfloor\frac{n}{k}\rfloor}\lfloor\frac{n}{dk}\rfloor\lfloor\frac{m}{dk}\rfloor\mu(d)
直接數論分塊

接着下一題:
t(1t10000)t(1\leq t\leq10000)組數據,每組數據給定n,m(1nm107)n,m(1\leq n\leq m\leq10^7)i=1nj=1m[gcd(i,j)]\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)爲素數]
(bzoj2820)
咋一看怎麼和剛剛的還是那麼像?
記素數集爲primeprime
所以我們直接枚舉素數,得到pprimei=1nj=1m[gcd(i,j)=p]\sum_{p\in prime}\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=p]
由上題可得:原式=pprimed=1npnpdmpdμ(d)\sum_{p\in prime}\sum_{d=1}^{\frac{n}{p}}\lfloor\frac{n}{pd}\rfloor\lfloor\frac{m}{pd}\rfloor\mu(d)
然後我們記k=pdk=pd,枚舉kk,得到:
k=1nnkmkpprime,pkμ(kp)\sum_{k=1}^n\lfloor\frac{n}{k}\rfloor\lfloor\frac{m}{k}\rfloor\sum_{p\in prime,p|k}\mu(\frac{k}{p})
設函數f(n)=pprime,pnμ(np)f(n)=\sum_{p\in prime,p|n}\mu(\frac{n}{p})
所以原式=k=1nnkmkf(k)\sum_{k=1}^n\lfloor\frac{n}{k}\rfloor\lfloor\frac{m}{k}\rfloor f(k)
我們可以在線性篩的時候處理f(n)f(n)
nn爲素數時,顯然f(n)=1f(n)=1
nn爲合數時,
prm[j]prm[j]nn的最小素因子(線性篩中當前枚舉的素數),i=npi=\frac{n}{p}
prm[j]iprm[j]|inn的最小素因子prm[j]prm[j]的次數大於11)時,
ii無多個次數大於1的素因子時,當且僅當p=prm[j]p=prm[j]μ(np)̸=0\mu(\frac{n}{p})\not=0,此時f(n)=μ(nprm[j])=μ(i)f(n)=\mu(\frac{n}{prm[j]})=\mu(i)
ii有多個次數大於1的素因子時,無論prm[j]prm[j]等於多少,μ(np)=0\mu(\frac{n}{p})=0,又因爲易知μ(i)=0\mu(i)=0,所以f(n)=μ(np)=0=μ(i)f(n)=\mu(\frac{n}{p})=0=\mu(i)
所以當prm[j]iprm[j]|if(n)=μ(i)f(n)=\mu(i)
prm[j]̸iprm[j]\not|inn的最小素因子prm[j]prm[j]的次數等於11)時,
此時,nn就比ii多了一個素因數prm[j]prm[j],因爲
f(i)=pi,pprimeμ(ip)f(i)=\sum_{p|i,p\in prime}\mu(\frac{i}{p})
f(n)=pn,pprimeμ(np)=pn,pprimeμ(iprm[j]p)f(n)=\sum_{p|n,p\in prime}\mu(\frac{n}{p})=\sum_{p|n,p\in prime}\mu(\frac{i*prm[j]}{p})
因爲ii不含素因子prm[i]prm[i],所以
μ(iprm[j]p)=μ(ip)\mu(\frac{i*prm[j]}{p})=-\mu(\frac i p)
又因爲nnii多一個素因子prm[j]prm[j],所以
f(n)=pn,pprime,p̸=prm[j]μ(ip)+μ(nprm[j])f(n)=-\sum_{p|n,p\in prime,p\not= prm[j]}\mu(\frac{i}{p})+\mu(\frac n{prm[j]})
=μ(i)pi,pprimeμ(ip)=\mu(i)-\sum_{p|i,p\in prime}\mu(\frac{i}{p})
=μ(i)f(i)=\mu(i)-f(i)
這樣我們就可以在線性篩的時候預處理ff,然後直接數論分塊解決。

繼續
t(1t1000000)t(1\leq t\leq1000000)組數據,每組數據給定n,m,k(1n107)n,m,k(1\leq n\leq10^7)i=1ngcd(i,n)\sum_{i=1}^ngcd(i,n)
前置知識:狄利克雷卷積
首先枚舉gcd(i,n)gcd(i,n)
dndi=1n[gcd(i,n)=d]\sum_{d|n}d\sum_{i=1}^n[gcd(i,n)=d]
除掉dd得到:
dndi=1nd[gcd(i,nd)=1]\sum_{d|n}d\sum_{i=1}^{\frac nd}[gcd(i,\frac nd)=1]
反演:
dndi=1ndki,kndμ(k)\sum_{d|n}d\sum_{i=1}^{\frac nd}\sum_{k|i,k|\frac nd}\mu(k)
枚舉kk
dnknddμ(k)ndk\sum_{d|n}\sum_{k|\frac nd}d\mu(k)\frac n{dk}
我們記T=dkT=dk,然後枚舉T:
TnnTdTdμ(Td)\sum_{T|n}\frac nT\sum_{d|T}d\mu(\frac Td)
g(n)=n,f(n)=dndμ(nd)g(n)=n,f(n)=\sum_{d|n}d\mu(\frac nd)
顯然gg是積性函數
然後我們發現ffggμ\mu的狄利克雷卷積,所以也是積性函數
然後我們發現原式其實也就是ffgg的狄利克雷卷積,所以也是一個積性函數
直接線性篩,然後O(1)O(1)詢問。

其實還有一種更簡單的做法,需要用到歐拉函數的性質dnϕ(d)=n\sum_{d|n}\phi(d)=n
利用這個性質我們就可以吧原式轉化爲:
i=1ndi,dnϕ(d)\sum_{i=1}^{n}\sum_{d|i,d|n}\phi(d)
直接枚舉dd,就可以直接得到
dnϕ(d)nd\sum_{d|n}\phi(d)\frac nd
這顯然是狄利克雷卷積的形式,是一個積性函數,直接線性篩就OK了。

再看一道題
t(1t10000)t(1\leq t\leq10000)組數據,每組數據給定n,m,k(1nm107)n,m,k(1\leq n\leq m\leq10^7).求:i=1nj=1mgcd(i,j)\sum_{i=1}^n\sum_{j=1}^mgcd(i,j)
這道題和剛剛有點像?
還是先枚舉gcd(i,j)gcd(i,j)
d=1ndi=1nj=1m[gcd(i,j)=d]\sum_{d=1}^nd\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=d]
通過之前第二題的結論可以得到:
d=1ndk=1nndkmdkμ(k)\sum_{d=1}^nd\sum_{k=1}^n\lfloor\frac n{dk}\rfloor\lfloor\frac m{dk}\rfloor\mu(k)
我們令T=dkT=dk,然後直接枚舉TT
T=1nnTmTdTdμ(Td)\sum_{T=1}^n\lfloor\frac nT\rfloor\lfloor\frac mT\rfloor\sum_{d|T}d\mu(\frac Td)
f(n)=dTdμ(Td)f(n)=\sum_{d|T}d\mu(\frac Td),顯然是狄利克雷卷積的形式,是一個積性函數,可以直接線性篩。
所以原式可以轉化爲:
T=1nnTmTf(T)\sum_{T=1}^n\lfloor\frac nT\rfloor\lfloor\frac mT\rfloor f(T)
直接數論分塊O(n+m)O(\sqrt n+\sqrt m)
這道題同樣也可以用歐拉函數,而且同樣簡單很多
原式可以直接轉化爲
i=1nj=1mdi,djϕ(d)\sum_{i=1}^n\sum_{j=1}^m\sum_{d|i,d|j}{\phi(d)}
直接枚舉dd
d=1nϕ(d)ndmd\sum_{d=1}^n\phi(d)\lfloor\frac nd\rfloor\lfloor\frac md\rfloor
然後數論分塊就OK了。
就是這麼簡單。
那幹嘛要講莫比烏斯反演的做法?
練手感…因爲很多題都是隻能用莫比烏斯反演做的,比如說下一題:
t(1t1000000)t(1\leq t\leq1000000)組數據,每組數據給定n,m,k(1n107)n,m,k(1\leq n\leq10^7)i=1nlcm(i,n)\sum_{i=1}^nlcm(i,n)
先講一種用歐拉函數的O(nlogn)O(nlogn)做法(當然在這道題會TLE,但是可以瞭解一下,這種做法非常神奇)
i=1nlcm(i,n)\sum_{i=1}^nlcm(i,n)
=ni=1nigcd(i,n)=n\sum_{i=1}^n\frac i{gcd(i,n)}
=ndn1di=1ni[gcd(i,n)=d]=n\sum_{d|n}\frac1d\sum_{i=1}^{n}i[gcd(i,n)=d]
=ndn1di=1ndid[gcd(i,nd)=1]=n\sum_{d|n}\frac1d\sum_{i=1}^{\frac nd}id[gcd(i,\frac nd)=1]
=ndni=1ndi[gcd(i,nd)=1]=n\sum_{d|n}\sum_{i=1}^{\frac nd}i[gcd(i,\frac nd)=1]
=ndndϕ(d)+[d=1]2=n\sum_{d|n}\frac {d\phi(d)+[d=1]}2
前面幾行應該都懂了吧,都做了那麼多題了
問題是最後一行…
我們只考慮後面的式子:i=1ndi[gcd(i,nd)=1]\sum_{i=1}^{\frac nd}i[gcd(i,\frac nd)=1]
因爲ddnn的因數,所以我們可以用dd代替nd\frac nd
i=1di[gcd(i,d)=1]\sum_{i=1}^di[gcd(i,d)=1]
其實就是求小於等於dddd互質的數的和
然後我們會發現如果xd(x&lt;d)x\perp d(x&lt;d),那麼(dx)d(d-x)\perp d
所以我們可以把與dd互質的數首尾兩兩分組,他們的和就是dd,然後他們所有的和就是dϕ(d)2\frac{d\phi(d)}2,如果x=dxx=d-x也不影響,特判一下d=1的情況就OK了。
然後線性篩出ϕ\phi,調和級數時間預處理答案。
但是這道題要O(n)O(n)纔行啊,有更優秀的做法嗎?
莫比烏斯反演
i=1nlcm(i,n)\sum_{i=1}^nlcm(i,n)
=ni=1nigcd(i,n)=n\sum_{i=1}^n\frac i{gcd(i,n)}
=ndn1di=1ni[gcd(i,n)=d]=n\sum_{d|n}\frac1d\sum_{i=1}^{n}i[gcd(i,n)=d]
=ndn1di=1ndid[gcd(i,nd)=1]=n\sum_{d|n}\frac1d\sum_{i=1}^{\frac nd}id[gcd(i,\frac nd)=1]
=ndni=1ndi[gcd(i,nd)=1]=n\sum_{d|n}\sum_{i=1}^{\frac nd}i[gcd(i,\frac nd)=1]
=ndni=1ndiki,kndμ(k)=n\sum_{d|n}\sum_{i=1}^{\frac nd}i\sum_{k|i,k|\frac nd}\mu(k)
=ndnkndμ(k)ki=1ndki=n\sum_{d|n}\sum_{k|\frac nd}\mu(k)k\sum_{i=1}^{\frac n{dk}}i
=nknμ(k)kdnki=1di=n\sum_{k|n}\mu(k)k\sum_{d|\frac nk}\sum_{i=1}^di
後面那個式子用等差數列求和:
=nknμ(k)kdnkd(d+1)2=n\sum_{k|n}\mu(k)k\sum_{d|\frac nk}\frac{d(d+1)}{2}
=n2knμ(k)kdnk(d2+d)=\frac n2\sum_{k|n}\mu(k)k\sum_{d|\frac nk}(d^2+d)
我們記f(n)=knμ(k)kdnkd2,g(n)=knμ(k)kdnkdf(n)=\sum_{k|n}\mu(k)k\sum_{d|\frac nk}d^2,g(n)=\sum_{k|n}\mu(k)k\sum_{d|\frac nk}d
可以輕鬆證明這兩個都是積性函數,可以線性篩。
然後就OK了。
留一道題給讀者思考:
【BZOJ2693】jzptab

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章