$Mobius$ $inversion$ $formula$

  以后的博客都改用楷体了,还是楷体好看.

  首先既然要学莫比乌斯反演,我们就应该先知道莫比乌斯反演名字的来源,莫比乌斯函数是根据$19$世纪的数学家奥古斯特·莫比乌斯命名的.

  接下来看一下一个叫做莫比乌斯函数的东西:

  $\mu(n)= \left\{\begin{matrix}1,n=1 \\ (-1)^k,n=\prod_{i=1}^k p_i \\0,others \end{matrix}\right.$

  还有一些小的知识点:

  数论函数:定义域为$N$的函数.举几个例子:

    1. $\varphi (n)=\sum_{i=1}^n[(i,n)==1]$

    2. $id(n)=n$

    3. $1(n)=1$

    4. $d(n)=\sum_{d|n}1$

    5. $\sigma (n)=\sum_{d|n}d$

    6. $\varepsilon (n)=[n=1]$

​  积性函数:对于任意$(a,b)=1$,满足$f(ab)=f(a)\times f(b)$

  完全积性函数:$f(a,b)=f(a)\times f(b)$

​  来尝试一下运用: 

  $\mu(n)$ 和 $\varphi(n)$ 都是积性函数,所以都可以线性筛:

  
 1 # include <cstdio>
 2 # include <iostream>
 3 # define R register int
 4 
 5 using namespace std;
 6 
 7 const int maxn=100000;
 8 int phi[maxn],n,pri[maxn],vis[maxn],h;
 9 
10 int main()
11 {
12     scanf("%d",&n);
13     phi[1]=1;
14     for (R i=2;i<=n;++i)
15     {
16         if(!vis[i])
17             pri[++h]=i,phi[i]=i-1;
18         for (R j=1;j<=h&&i*pri[j]<=n;++j)
19         {
20             vis[ i*pri[j] ]=1;
21             if(i%pri[j]==0)
22             {
23                 phi[ i*pri[j] ]=phi[i]*pri[j];
24                 break;
25             }
26             phi[ i*pri[j] ]=phi[i]*(pri[j]-1);
27         }
28     }
29     for (R i=1;i<=n;++i)
30         printf("%d ",phi[i]);
31     return 0;
32 }
线性筛phi

相关文章: