前置芝士
極高的數學造詣與不怕勞累的精神html
佔坑,待重寫函數
正文
咱們能夠很是輕易地手動模擬出${f(n)}$與${g(d)}$的關係url
$${f(1)=g(1)}$$spa
$${f(2)=g(1)+g(2)}$$.net
$${...}$$code
$${f(6)=g(1)+g(2)+g(3)+g(6)}$$htm
與此同時,咱們也同樣可以從${f(n)}$逆推到${g(d)}$blog
$${g(1)=f(1)}$$get
$${g(2)=f(2)-f(1)}$$數學
$${...}$$
$${g(6)=f(6)-f(3)-f(2)+f(1)}$$
咱們會發現,這樣的一個式子,並無從${f(n)}$到${g(d)}$那麼和諧,而是有加有減,彷佛不太好處理。
$${g(n)=\sum_{d|n}^{}}f(d)*? $$
咱們會發現,每個${g(n)}$都是由上面這樣一個式子推出來的,只不過還多了一個係數
而後咱們就要引入一個新的東西
莫比烏斯函數
莫比烏斯函數是一個頗有趣的函數,其中有不少很優美,咱們也特別喜歡的性質
性質1:莫比烏斯函數是一個積性函數
這個東西應該沒什麼好說的,本身帶一帶,YY一下就能出來~~(實際上是我本身懶得證實啦QAQ)~~
這對咱們有什麼好處呢?
還記得歐拉函數${\varphi (n)}$嗎
因此一樣,咱們也能夠用線性篩來求解莫比烏斯函數
第一種求法:利用定義來求莫比烏斯函數
貼代碼吧,自行理解
void mobius() { for(int i=1;i<=maxn;++i) miu[i]=1; for(int i=2;i<=maxn;++i) { if(!vis[i]) { miu[i]=-1; for(int j=i+i;j<=maxn;j+=i) { vis[j]=1; if((j/i)%i==0) miu[j]=0; else miu[j]*=-1; } } } }
第二種求法:利用積性函數的性質來求莫比烏斯函數
樓主很懶,什麼也沒有留下
性質2:對於任意正整數n,有 $$ {\sum_{d|n}} \mu(d) \left{\begin{matrix} 1,n=1\ 0,n>1 \end{matrix}\right. $$
這兩個性質真是太美妙了不是嗎
回到正題,上文咱們獲得
$${g(n)=\sum_{d|n}^{}}f(d)*? $$
繼續觀察,咱們能夠發現
${f(1)}$的符號並非惟一肯定的(觀察${g(1)andg(6)}$)
因而咱們能夠猜測,前面的係數與${\frac{n}{d}}$有關
因此咱們能夠猜測獲得
$${{g(n)=\sum_{d|n}^{}}f(d)*\mu (\frac{n}{d})} $$
而後再代換一下,獲得
$${{g(n)=\sum_{d|n}^{}}f(\frac{n}{d})*\mu (d)} $$
既然是猜測,天然須要證實
首先咱們能夠把${f(\frac{n}{d})}$換出來
就能夠獲得 $${\sum_{d|n}^{}}(\mu (d)*\sum_{i|\frac{n}{d}}^{}g(i))$$
而後咱們能夠發現其實就是要知足
$${d*i|n}$$
也能夠這麼理解,對於每個二元組:
$${(\mu (d),g(i))}$$
只須要保證每個這樣的二元組都可以被枚舉到就行了
因此這個式子就能夠變換爲
$${\sum_{i|n}^{}}(g(i)\sum_{id|n}^{}\mu(d))$$
若是實在不理解能夠帶一個具體值進去手動模擬一下,可能就茅塞頓開了
而後咱們能夠再代換一下
就變成了
$${\sum_{i|n}^{}}(g(i)*\sum_{d|\frac{n}{i}}^{}\mu(d))$$
看看後面的這一塊,有沒有想到咱們美妙的性質1啊?
當${i=n}$時,顯然${\sum_{d|\frac{n}{i}}^{}\mu(d)}=$${\sum_{d|1}^{}\mu(d)}=1$
當${i\neq n}$時,顯然${\frac{n}{i}>0}$,故此時這裏就能夠證得
$${{g(n)=\sum_{d|n}^{}}f(\frac{n}{d})*\mu (d)} $$
完結撒花!!!
Upd:
莫比烏斯反演的另外一種基本形式 $${{g(n)=\sum_{n|d}^{}}f(d)*\mu (\frac{d}{n})} $$
也能夠用上述相似的方法證實獲得