I.前置知识:
单位函数(\(\epsilon\)):
\[\begin{aligned} \epsilon(i) &= \begin{cases} 1, & i = 1 \\ 0, & i \ne 1 \end{cases} \end{aligned} \]
即当且仅当 $i = 1 $时取值取值为 \(1\),否则为 \(0\)。
Dirichlet 卷积( * ):
Dirichlet 卷积是函数之间的运算,即
\[h = f \ast g\]
其中\(f, g, h\)是函数。则
\[h(n) = \sum \limits_{d | n} f(d) · g \left( \frac{n}{d} \right)\]
也可以写作
\[ h(n) = \sum \limits_{i · j = n} f(i) · g(j) \]
我们发现: \(\epsilon\) 函数是 \(Dirichlet\) 卷积的单位元,即
\[f = f \ast \epsilon\]
Mobius 函数( μ ):
\(\mu(n) = \begin{cases} 1, & n = 1 \\ (-1)^m, &n = \prod_{i=1}^{n} \space p_i \\ 0, &otherwise \end{cases}\)
可以看出,$ μ(n) $ 恰在 \(n\)无平方因子时取值非零。
\[\begin{aligned} \sum \limits_{d | n} \mu(d) = \epsilon(n) \end{aligned}\]
\[\epsilon = 1 \ast \mu \]
另:这玩意是可以线性筛的:
inline void prework()
{
miu[1]=1;
for(int i=2;i<N;++i)
{
if(!vis[i]) pri[cnt++]=i,miu[i]=-1;
for(int j=0;j<cnt&&i*pri[j]<N;++j)
{
vis[i*pri[j]]=1; if(i%pri[j]) miu[i*pri[j]]=-miu[i];
else{miu[i*pri[j]]=0; break;}
} miu[i]+=miu[i-1];
}
return ;
}
这个筛法的过程还是相当好理解的
II. Mobius 变换
设 \(f\) 是数论函数,定义函数 \(g\) 满足
\[g(n) = \sum \limits_{d | n} f(d)\]
则称 \(g\) 是 \(f\) 的 \(Mobius\) 变换。用 \(Dirichlet\) 卷积表示即为 \(g = f \ast 1\)
推一下式子。
\[g = f \ast 1\]
\[\Rightarrow f = f \ast \epsilon\]
\[= f \ast 1 \ast \mu\]
\[ = g \ast \mu\]
即
\[\color{red} {g = f \ast 1 \Leftrightarrow f = g \ast \mu}\]
III.几道例题
1.双亲数
这个题第一次用到\(Mobius\)反演吧,然后要预处理\(Mobius\)函数和整除分块,详情Click here
IV.感悟&&总结
初步理解反演的基础就是把式子转化成你整除分块能求的式子,然后进行整除分块