莫比烏斯函式
莫比烏斯函式(Möbius)
定義
定義莫比烏斯函式 \(μ(x), x\in N^+\) :
當 \(x=p_1^{d_1}\cdot p_2^{d_2}\cdots p_k^{d_k}\) (唯一分解定理)
\[μ(x)= \begin{cases} 0 & \exists\ d_i>1 \\ 1 & k\text{是偶數}\\ -1 & k\text{是奇數} \end{cases} \]顯然,這是個數論函式。
性質
-
\(n\ne 0\)時,\(n\) 的所有因子的莫比烏斯函式值和為 \(0\)
\[\sum_{d|n}\mu (x)= \begin{cases} 1 & n=1\\ 0 & n>0 \end{cases}\]證明:
-
\(n=1\) 時顯然成立。
-
\(n>1\) 時有:
\[n=p_1^{d_1}\cdot p_2^{d_2}\cdots p_k^{d_k} \]\[\because \mu (d) \ne 0 \Rightarrow d=p_1p_2 p_3 \cdots p_t \]\[\text{故質因子個數為r的因子只有$C_k^r$個} \]\[\therefore \sum_{d|n}\mu (x)=C_k^0-C_k^1+C_k^2+\cdots+(-1)^kC_k^k=\sum_{i=0}^k(-1)^iC_k^i \]\[\because (x+y)^n=\sum_{i=0}^nC_n^ix^iy^{n-i} \text{(二項式定理)} \]
-
-
莫比烏斯函式是積性函式
對任意 \(n \in Z^+\) 有:
\[\sum_{d|n} \frac{\mu (d)}{d}=\frac{\varphi(n)}{n} \]代入莫比烏斯反演公式
(我也不會)即可。
應用
這個函式可用來解決如下問題:
與某個數 \(N\) 互質的數的個數:
設 \(S_p\) 表示\(1 - n\) 中 \(p\) 的倍數的個數。
則根據容斥原理,所求轉化為如下式子:\(N-S_2-S_3-\cdots +S_{2,3}+S_{2,5}+\cdots -S_{2,3,5}\cdots\)
通過觀察,每一個 \(S\) 代表的集合的數的莫比烏斯函式就是這個 \(S\) 的係數。
莫比烏斯函式可以利用篩法求出。
例題:破譯密碼
達達正在破解一段密碼,他需要回答很多類似的問題:
對於給定的整數\(a,b\)和\(d\),有多少正整數對\(x,y\),滿足\(x<=a,y<=b\),並且\(gcd(x,y)=d\)。
作為達達的同學,達達希望得到你的幫助。
輸入格式
第一行包含一個正整數 \(n\) ,表示一共有n組詢問。
接下來 \(n\) 行,每行表示一個詢問,每行三個正整數,分別為 \(a,b,d\) 。
輸出格式
對於每組詢問,輸出一個正整數,表示滿足條件的整數對數。
資料範圍
\(1≤n≤50000, 1≤d≤a,b≤50000\)
解析
考慮對於每一個詢問如何做。
對於一組\(1\leq x\leq a,1\le y\le b\)
\(gcd(x,y)=d\Rightarrow gcd(x^{\prime},y^{\prime})=1\)
其中 \(x^{\prime}=\frac{x}{d}\ ,\ y^{\prime}=\frac{y}{d}\ ,\ x^{\prime}\in[1,\lfloor\frac{a}{d}\rfloor],y^{\prime}\in[1,\lfloor\frac{b}{d}\rfloor]\)
問題轉化為:有多少對 \(x^{\prime},y^{\prime}\) 互質。
可以考慮容斥定理:
\[Ans=a^{\prime}b^{\prime}-\lfloor\frac{a^{\prime}}{2}\rfloor\lfloor\frac{b^{\prime}}{2}\rfloor+\lfloor\frac{a^{\prime}}{3}\rfloor\lfloor\frac{b^{\prime}}{3}\rfloor-\lfloor\frac{a^{\prime}}{5}\rfloor\lfloor\frac{b^{\prime}}{5}\rfloor\cdots+\lfloor\frac{a^{\prime}}{6}\rfloor\lfloor\frac{b^{\prime}}{6}\rfloor+\cdots \]記 \(\lfloor\frac{a^{\prime}}{i}\rfloor\lfloor\frac{b^{\prime}}{i}\rfloor=S_i\)
上面的式子很熟悉了,我們還可以繼續化得下面的式子:
\[Ans=a^{\prime}\cdot b^{\prime}+\sum_{i=1}^{min(a^{\prime},b^{\prime})}\lfloor\frac{a^{\prime}}{i}\rfloor\lfloor\frac{b^{\prime}}{i}\rfloor\cdot\mu (i) \]直接做的話是 \(O(n^2)\) 的。
考慮對於 \(\lfloor\frac{a^{\prime}}{i}\rfloor\) ,有 \(\lfloor\frac{a^{\prime}}{1}\rfloor,\lfloor\frac{a^{\prime}}{2}\rfloor,\cdots ,\lfloor\frac{a^{\prime}}{a^{\prime}}\rfloor\) 共 \(a^{\prime}\) 項,但是不同的數只有 \(2\sqrt{a^{\prime}}\) 個。 於是可以考慮 \(O(\sqrt{n})\) 分塊 , 複雜度變為 \(O(n\sqrt{n})\) 可以接受。
下面解釋一下為什麼只有 \(2\sqrt{a^{\prime}}\) 個分段:
令 \(A(x)=\lfloor\frac{a^{\prime}}{x}\rfloor\)
將序列分為兩部分:\(A(1) \sim A(\sqrt{a^{\prime}})\ ,\ A(\sqrt{a^{\prime}}+1) \sim A(a^{\prime})\)
對於左邊,顯然有且只有 \(\sqrt{n}\) 個取值。
對於右邊,觀察得知分母是恆大於 \(\sqrt{a^{\prime}}\) 的,則整個項的值是恆小於 \(\sqrt{a^{\prime}}\) 的,總共 \(\sqrt{a^{\prime}}\) 個不同取值。
兩邊相加,得證。
然後是另外一個問題,怎麼去求每一段。
這裡定義:\(g(x)\) 為 \(\lfloor\frac{a^{\prime}}{x}\rfloor=k\) 時 \(x\) 能夠取到的最大整數。
即 \(\lfloor\frac{a^{\prime}}{x}\rfloor=\lfloor\frac{a^{\prime}}{g(x)}\rfloor\) 且 \(\lfloor\frac{a^{\prime}}{x}\rfloor > \lfloor\frac{a^{\prime}}{g(x)+1}\rfloor\)
對於這個函式有這樣一個經典公式 \(g(x)=\Big\lfloor\frac{a^{\prime}}{\lfloor\frac{a^{\prime}}{x}\rfloor}\Big\rfloor\)
下面給出正確性證明(下面的 \(a\) 其實是上面的 \(a^{\prime}\)):
\[\because g(x)=\Big\lfloor\frac{a}{\lfloor\frac{a}{x}\rfloor}\Big\rfloor \]\[\therefore g(x) \geq \Big\lfloor\frac{a}{\frac{a}{x}}\Big\rfloor = x \]\[\therefore \lfloor \frac{a}{g(x)} \rfloor \leq \lfloor \frac{a}{x} \rfloor \]\[\because \Bigg\lfloor \frac{a}{\frac{a}{\lfloor\frac{a}{x}\rfloor}} \Bigg\rfloor \geq \lfloor \frac{a}{x} \rfloor\Rightarrow \Bigg\lfloor \frac{a}{\Big\lfloor\frac{a}{\lfloor\frac{a}{x}\rfloor}\Big\rfloor} \Bigg\rfloor \geq \lfloor \frac{a}{x} \rfloor \]\[\therefore \lfloor \frac{a}{g(x)} \rfloor \geq \lfloor \frac{a}{x} \rfloor \]\[\text{故 $\lfloor \frac{a}{g(x)} \rfloor = \lfloor \frac{a}{x} \rfloor$ 成立} \]\[\text{設 $a=kx+r , 0\leq r \leq x$ (帶餘除法)} \]\[\text{代入 $\lfloor\frac{a}{x}\rfloor > \lfloor\frac{a}{g(x)+1}\rfloor$ 得:} k>\Big\lfloor\frac{a}{\lfloor\frac{a}{k}\rfloor+1}\Big\rfloor \]\[k(\lfloor\frac{a}{k}\rfloor+1)>a \]\[\text{再設$a=pk+q,0\leq q < k$} \]\[\text{代入得:} k(p+1)>pk+q\Rightarrow k>q,\text{滿足要求} \]\[\text{故 $\lfloor\frac{a}{x}\rfloor > \lfloor\frac{a}{g(x)+1}\rfloor$ 成立} \]有了這個結果,整個問題就簡單多了。
code:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e4+10;
int primes[N],cnt;
bool mp[N];
int mob[N],sum_[N];//莫比烏斯函式,字首和
void init(int n)//線篩求莫比烏斯函式
{
mob[1]=1;
for(int i=2; i<=n; i++)
{
if(!mp[i])
{
primes[cnt++]=i;
mob[i]=-1;//質數有兩個一次質因子
}
for(int j=0; primes[j]*i<=n; j++)
{
int tmp=primes[j]*i;
mp[tmp]=1;
if(i%primes[j]==0)
{
mob[tmp]=0;//tmp有二次質因子
break;
}
mob[tmp]=mob[i]*-1;//多了一個質因子
}
}
for(int i=1; i<=n; i++) //字首和
{
sum_[i]=sum_[i-1]+mob[i];
}
}
int main()
{
init(5e4);
int n;
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
int a,b,d;
scanf("%d%d%d",&a,&b,&d);
a/=d,b/=d;//問題轉化
int mina=min(a,b);
ll res=0;
for(int l=1,r; l<=mina; l=r+1) //分塊
{
r=min(mina,min(a/(a/l),b/(b/l)));//每次只往後面跳一個較小的值
res+=(sum_[r]-sum_[l-1])*(ll)(a/l)*(b/l);//核心式子
}
printf("%lld\n",res);
}
return 0;
}