莫比乌斯反演

由于一道题目用到了莫反,所以学了一下,赶紧隔了好几天才想起来记下来。

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)\) 的,如果要加快的话还要杜教筛等科技。

posted @ 2024-07-30 19:32  YT0104  阅读(6)  评论(0编辑  收藏  举报