由 [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}
\]
額,不過這式子好像也沒啥用,至少我沒見過要用這個的題
完
感覺好像自己還真瞎想出來不少東西(