莫比乌斯反演
由于一道题目用到了莫反,所以学了一下,赶紧隔了好几天才想起来记下来。
STO 忘忧老师是神!!!/bx/bx/bx
莫比乌斯反演
前置芝士:莫比乌斯函数:
\(\mu\) 为莫比乌斯函数,定义为:
\[设:\ n=\prod_{i=1}^{k}p_i^{c_i}
\\
则:\mu(n) =\begin{cases}
1 &n=1\\
0 &\exist c_i>1\\
(-1)^k &\forall c_i=1\\
\end{cases}
\]
可以知道,这是个极性函数,所以求解可以用线性筛(线性筛基本可以求所有的积性函数,尽管方法不尽相同)。
mu[1]=1;
for(int i=2;i<=n;i++)
{
if(!ck[i]) p[++num]=i,mu[i]=-1;
for(int j=1;j<=num&&p[j]*i<=n;j++)
{
ck[p[j]*i]=1;
if(!(i%p[j])) break;
mu[p[j]*i]=-mu[i];
}
}
莫比乌斯反演:
结论:
\[[\ \gcd(i,j)=1] = \sum_{d|gcd(i,j)}\mu(d)
\]
转化应用:
求:\(\sum_{i=1}^n \sum_{j=1}^m [\ \gcd(i,j)=1]\)
解:
\[\begin{align*}
\sum_{i=1}^n \sum_{j=1}^m [\ \gcd(i,j)=1]
&= \sum_{i=1}^n \sum_{j=1}^m \sum_{d|gcd(i,j)} \mu(d)\\
&= \sum_{d|i} \mu(d) \sum_{i=1}^n [d|i] \sum_{j=1}^m [d|j]\\
&= \sum_{d|i}^{\min(n,m)} \mu(d) \lfloor \frac{n}{d} \rfloor \lfloor \frac{m}{d} \rfloor \\
\end{align*}\]
这样我们就可以 \(O(n)\) 求解了,如果用整除分块的话可以做到 \(O(\sqrt{n})\),但是 \(\mu\) 的求解是 \(O(n)\) 的,如果要加快的话还要杜教筛等科技。