【学习笔记】莫比乌斯反演

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.感悟&&总结

初步理解反演的基础就是把式子转化成你整除分块能求的式子,然后进行整除分块

上一篇:day19 PDF文件操作


下一篇:[AST Tools] Babel template: replace JQuery