1. 程式人生 > >由 [SDOI2012]Longge的問題 探討尤拉函式和莫比烏斯函式的一些性質和關聯

由 [SDOI2012]Longge的問題 探討尤拉函式和莫比烏斯函式的一些性質和關聯

本題題解

題目傳送門:https://www.luogu.org/problem/P2303

給定一個整數\(n\),求
\[ \sum_{i=1}^n \gcd(n,i) \]

蒟蒻隨便yy了一下搞出來個\(O(\sqrt{n})\)的演算法 這題資料怎麼這麼水

首先看到gcd我們就下意識的對它反演一波對吧

第一步

\[ \sum_{i=1}^n \gcd(n,i) = \sum_{d|n} \varphi(d) \frac{n}{d} \]

這裡提供兩種化法,得到的結果都是這個。

法一

根據尤拉函式和式
\[ n = \sum_{d|n} \varphi(d) \]
暴力推導即可
\[ \begin{align} \sum_{i=1}^n \gcd(n,i) &= \sum_{i=1}^n \sum_{d|\gcd(n,i)} \varphi(d) \\ &= \sum_{d|n} \sum_{i=1}^{\frac n d} \varphi(d) \\ &= \sum_{d|n} \varphi(d) \frac n d \end{align} \]

法二

根據尤拉函式的定義式
\[ \varphi(n) = \sum_{i=1}^n [\gcd(n,i) = 1] \]
PS:\(\varphi(n)\)表示\(1\)~\(n-1\)內與\(n\)互質的數,將和式上界提升到\(n\)不但不會影響正確性(\(\gcd(n,n) = n \neq 1\)),而且讓\(\varphi(1)\)不用特判。

易得
\[ \begin{align} \sum_{i=1}^n \gcd(n,i) &= \sum_{d|n} d \sum_{i=1}^n [\gcd(n,i) = d] \\ &= \sum_{d|n} d \sum_{i=1}^{\frac n d} [\gcd(\frac n d,i) = 1] \\ &= \sum_{d|n} d \varphi(\frac n d) \\ &= \sum_{d|n} \varphi(d) \frac n d \\ \end{align} \]

這一步還是比較簡單的。稍有基礎的同學大概都會吧

第二步


\[ g(n) = \sum_{i=1}^n \gcd(n,i) = \sum_{d|n} \varphi(d) \frac{n}{d} \]
我們希望求\(g\)的在\(n\)的函式值。容易發現右式是狄利克雷卷積\(\varphi * Id\),也就是說\(g\)也是積性函式。所以考慮質因數分解\(n\),最後用積性累乘出來


\[ g(n) = g({p_1}^{c_1}) g({p_2}^{c_2}) ... g({p_n}^{c_n}) \]
則只需求\(g(p^c)\)(這裡省略下標)

\(p^c\)的因數分別為\(1\),\(p\),\(p^2\),...,$ p^c$

所以有
\[ \begin{align} g(p^c) &= \sum_{i=0}^{c} \varphi(p^i) \frac{p^c}{p^i} \\ &= \sum_{i=0}^{c} \varphi(p^i) p^{c-i} \end{align} \]

求\(\varphi(p^c)\)

考慮先弄出上式中\(\varphi(p^i)\)的封閉形式,再帶回原式看看

根據尤拉函式通式
\[ \varphi(n) = n \prod_{i=1}^k (1 - \frac 1 {p_i}) \]
(這個\(\pi\)指的是分解質因數)

易得
\[ \begin{align} \varphi(p^c) &= p^c (1 - p) \\ &= p^c - p^{c-1} \end{align} \]
注意這個式子需要在\(c=0\)時特判,因為\(\varphi(1) = 1\)(\(1\)可以視作分解不出任何質因數)

求\(g(p^c)\)

得到了\(\varphi(p^c)\),帶回之前未推完的\(g(p^c)\)的式子,得
\[ \begin{align} g(p^c) &= \sum_{i=0}^{c} \varphi(p^i) p^{c-i} \\ &= p^c + \sum_{i=1}^{c} (p^i - p^{i-1}) p^{c-i} \\ &= p^c + \sum_{i=1}^{c} (p^c - p^{c-1}) \\ &= p^c + c (p^c - p^{c-1}) \\ &= (c+1)p^c - c \ p^{c-1} \end{align} \]
(中途對\(i=0\)進行了特殊討論)(該式同樣不適用於\(c=0\)的情況)

然後積性合併起來就完了

冷靜分析一波時間複雜度。質因數分解消耗\(O(\sqrt n)\)的時間複雜度,分解出不超過\(O(log_2 n)\)個\(p^c\),每個\(g(p^c)\)的計算是\(O(1)\)的。所以總時間複雜度為\(O(\sqrt n)\)

程式碼

非常簡單的程式碼

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef long long ll;

ll p[1005],c[1005],g[1005];ll kN;
void Div(ll n){
    kN=0;
    for(ll i=2;i*i<=n;i++){
        if(n%i==0){
            kN++;p[kN]=i;
            g[kN]=1;
            ll e=0;while(n%i==0) e++,n/=i,g[kN]*=i;
            c[kN]=e;
        }
    }
    if(n!=1) kN++,p[kN]=n,c[kN]=1,g[kN]=n;
}
ll N;
int main(){
    cin>>N;
    Div(N);
    ll pdt=1;
    for(int i=1;i<=kN;i++) pdt=pdt*((c[i]+1)*g[i]-c[i]*g[i]/p[i]);
    cout<<pdt;
    return 0;
}

這式子長得跟小粉兔菊苣的題解很像?


 

更多思考

坐車時無聊在草稿紙上瞎搞出來的

拓展到莫比烏斯函式

第一步化完後,我們得到這樣一個函式
\[ g(n) = \sum_{d|n} \varphi(d) \frac{n}{d} \]
然後我們用質因數分解弄出了一個求它單點函式值的方法

可不可以把它拓展到莫比烏斯函式上呢?
\[ g(n) = \sum_{d|n} \mu(d) \frac{n}{d} \]
直接仿照上面化\(\varphi\)的方法來

根據莫比烏斯函式定義,易得

\[\mu(p^c) = [c=1]\]

同樣需要特判\(c=0\)的情況

帶回得
\[ \begin{align} g(p^c) &= \sum_{i=0}^{c} \mu(p^i) p^{c-i} \\ &= p^c + \sum_{i=1}^{c} [i=1] p^{c-i} \\ &= p^c + p^{c-1} \end{align} \]
(該式同樣不適用於\(c=0\)的情況)

挺簡潔的對吧(

莫比烏斯函式與尤拉函式的相互關係

第一步我們在做什麼?
\[ \sum_{i=1}^n \gcd(n,i) = \sum_{d|n} \varphi(d) \frac{n}{d} \]
那我同樣考慮把它變到莫比烏斯函式上。

思考化該式時用到過的尤拉函式和式,聯絡到莫比烏斯函式的和式
\[ [n=1] = \sum_{d|n} \mu(d) \]
猜想
\[ \sum_{i=1}^n [\gcd(n,i)=1] = \sum_{d|n} \mu(d) \frac{n}{d} \]
證明很容易。
\[ \begin{align} \sum_{i=1}^n [\gcd(n,i)=1] &= \sum_{i=1}^n \sum_{d|\gcd(n,i)} \mu(d) \\ &= \sum_{d|n} \mu(d) \frac n d \\ \end{align} \]
然後你仔細看看左式

不對啊

就是

尤拉函式的定義式嗎

好於是我們歪打正著,找到了一個極其簡潔地描述了\(\mu\)和\(\varphi\)關聯的公式
\[ \varphi(n) = \sum_{d|n} \mu(d) \frac{n}{d} \]
將本式簡單變形就得到了一個更常見的表現形式
\[ \frac {\varphi(n)} n = \sum_{d|n} \frac{\mu(d)}{d} \]
額,不過這式子好像也沒啥用,至少我沒見過要用這個的題


 

感覺好像自己還真瞎想出來不少東西(