莫比乌斯反演与数论函数 更新于 2026/7/9 10:52:15 作者

command_block

本博客的第一篇博文哦!纪念。

---- 莫比乌斯反演,本质是利用莫比乌斯函数与其他函数间卷积关系,对函数做一系列简化,从而更高效的解决问题。

---- 数论函数,更广阔的天地,因为μ数论函数\mu∈\text{数论函数}

0.写在前面

这里面式子可能比较多,大家多看看证明,尤其是关键证明以及题目推导过程,硬记下的结论越少,越不容易忘记

(看不清式子可以放大网页)

由于写的时候匆忙,公式可能有错误,请私信或者在下方评论。

每个新东西提出后都会做题或者证明,权当熟悉。

不是一个下午就能看懂的,千万不要直接弃疗

  • 给大家简要介绍一下符号的意思。

有时候以(a,b)(a,b)简写gcd(a,b)gcd(a,b)

a\lfloor a\rfloor表示下取整,比如2.33=2\lfloor 2.33\rfloor=2

[???][???]表示 : 如果??????为真,则值为1,否则为0.(就像if里面的东西)

比如 [(8,6)>2]=0; [233=233]=1[(8,6)>2]=0;\ [233=233]=1

aba|b表示aabb的因数,注意,前面是后面的因数。

比如 [24]=1; [23]=0[2|4]=1;\ [2|3]=0

\sum称为和式,意思是对……求和。

比如说i[1in]i\sum\limits_{i}[1\leq i\leq n]i,表示枚举变量 ii,对 [1in]i[1\leq i\leq n]i 求和。

等价于:

int ans=0;
for (int i=1;i<=n;i++)
  ans+=i;

我们常把上界写在上面,下界写在下面,如i=1ni=1+2+3+...+n\sum\limits_{i=1}^ni=1+2+3+...+n

d6d=1+2+3+6\sum\limits_{d|6}d=1+2+3+6 (枚举66的因数)

1.狄利克雷卷积与数论函数

——介绍了狄利克雷卷积,数论函数(积性函数)的综合

定义:\color{blue}\text{定义:} 数论函数,就是值域为整数(陪域为复数,但这不重要)的函数。

也就是说下面出现的数没有特殊说明的话,都是整数

两个数论函数狄利克雷卷积是一个新函数

比如f(n),g(n)f(n),g(n)两个函数的狄利克雷卷积写作fg\Large{f*g} (相当于函数名称)。

什么意思呢?

定义:\color{blue}\text{定义:} (fg)(n)=dnf(d)g(n/d)\large{(f*g)(n)=\sum\limits_{d|n}f(d)g(n/d)}

换句话说就是(fg)(n)=xy=nf(x)g(y)\large{(f*g)(n)=\sum\limits_{x*y=n}f(x)g(y)}

(不过一般不这样写,因为不方便化式子。)

比如说计算(fg)(10)(f*g)(10)

可得f(1)g(10)+f(2)g(5)+f(5)g(2)+f(10)g(1)f(1)g(10)+f(2)g(5)+f(5)g(2)+f(10)g(1)

(对于某个新东西,能做到的话,理解的最好方式就是手动模拟)

狄利克雷卷积满足以下运算规律(显而易见,不证):

交换律——fg=gff*g=g*f;

结合律——(fg)h=f(gh)(f*g)*h=f*(g*h);

(狄利克雷卷积是一个对称的结构)

下面的推导都基于狄利克雷卷积,有必要好好理解。

介绍几个简单的数论函数,让你有个基本概念。

I(n)I(n) 无论nn是啥,它永远等于1,所以叫做废柴恒等函数

ϵ(n)ϵ(n)(也作e(n)e(n)) 当n=1时,函数值为1,否则为0。被称作元函数因为它是卷积的单位元(ϵf=fϵ*f=f)。(Important)

id(n)=nid(n)=n 被称作单位函数

附:idx(n)=nxid^x(n)=n^x 被称作幂函数(id(n)id(n)idx(n)id^x(n)的特殊情况)

e(n),I(n),id(n)e(n),I(n),id(n)是完全积性函数。

定义:\color{blue}\text{定义:}完全积性函数: 对于任意的整数a和b有I(ab)=I(a)I(b)I(ab)=I(a)I(b)

附上两个后面会讲的稍微复杂的例子:

φ(n)\varphi(n) 小于n的整数中,与n互质的数的个数,称作欧拉函数($\varphi(n)$)。

μ(n)\mu(n) 称作莫比乌斯函数($\mu(n)$)。

φ(n)φ(n)μ(n)\mu(n)函数是积性函数(我们后面会证明)。

定义:\color{blue}\text{定义:}积性函数: 对于一个函数FF , 如果(a,b)=1(a,b)=1时有F(ab)=F(a)F(b)F(ab)=F(a)F(b),则该函数是积性函数。

积性函数有许多优良性质哦,这些重要的性质我们后面会讲。

很明显,完全积性函数∈积性函数

下面是一些性质:

  • 对于一个积性函数FF,有F(1)=1F(1)=1

证明:\color{blue}\text{证明:} 根据F(1)=F(1)F(1)F(1)=F(1)F(1)(定义)可得F(1)=1F(1)=1

  • 对于函数FF,积性F(x)=F(p1k1)F(p2k2)...F(pmkm)→F(x)=F(p_1^{k_1})F(p_2^{k_2})...F(p_m^{k_m})

这里的p1...pmp_1...p_m是指xxmm因子,也就是把xx分解的结果。

k1...kmk_1...k_m则是p1...pmp_1...p_m对应的次数。

(比方说1800的分解结果就是2332522^3*3^2*5^2)

证明:\color{blue}\text{证明:} 因为p1k1,p2k2,...,pmkmp_1^{k_1},p_2^{k_2},...,p_m^{k_m}都互质,根据积性易证。

用处:形如F(primek)F(prime^k)的函数值是比较好分析的,我们在利用这个性质来分析一般的情况,后面你们会见到例子。

  • 两个积性函数的卷积还是积性函数。

(初学者可以先跳过证明)

设两个积性函数F1(x),F2(x)F_1(x),F_2(x)

它们的狄利克雷卷积是G(n)=dnF1(d)F2(n/d)G(n)=\sum\limits_{d|n}F_1(d)F_2(n/d)

证明:\color{blue}\text{证明:}设两数a,ba,b互质。

G(a)G(b)G(a)G(b)

$=\sum\limits_{d|a}F_1(d)F_2(a/d)*\sum\limits_{t|b}F_1(t)F_2(b/t)$

$=\sum\limits_{d|a}\sum\limits_{t|b}F_1(d)F_2(a/d)F_1(t)F_2(b/t)$

\sum合并(根据约数集合的合并),由于aabb互质,所以ttdd互质。

(根据积性可以把F1(d)F1(t)F_1(d)F_1(t)化为F1(dt)F_1(dt),F2F_2类似)

=dtabF1(dt)F2(ab/dt)=\sum\limits_{dt|ab}F_1(dt)F_2(ab/dt)

=G(ab)=G(ab),得证.

  • 积性函数的逆也是积性函数

(初学者可以先跳过证明)

来介绍一下函数在狄利克雷卷积意义下的

定义:\color{blue}\text{定义:}满足e=gfe=g*f时,ggff互逆。

(类比同余逆元理解)

附:函数的逆可以通过某种方式构造出来:构造方法(然并卵)

证明:\color{blue}\text{证明:}

考虑数学归纳法(跟构造方法有点像)

e=GFe=G*F,且FF是积性函数。

我们要证明对于任意的(a,b)=1(a,b)=1a,ba,b,都满足G(ab)=G(a)G(b)G(ab)=G(a)G(b)

因为e=dnF(d)G(n/d)e=\sum\limits_{d|n}F(d)G(n/d)

    1. a或b为1

    a=b=1a=b=1时,e(1)=1=F(1)G(1)e(1)=1=F(1)G(1)

    由于积性,根据上文F(1)=1F(1)=1,得G(1)=1G(1)=1

    所以当aab=1b=1时,结论显然成立。

    1. ab>1

    我们考虑已证明了所有的a<a; b<ba'<a;\ b'<b时,结论成立。

    $G(ab)=\sum\limits_{d|ab}F(d)G(ab/d)-\sum\limits_{d|ab,d≠1}F(d)G(ab/d)$

    e=GFe=G*F,得dabF(d)G(ab/d)=e(ab)\sum\limits_{d|ab}F(d)G(ab/d)=e(ab),由于ab>1ab>1所以e(ab)=0e(ab)=0

    =dab,d1F(d)G(ab/d)=-\sum\limits_{d|ab,d≠1}F(d)G(ab/d)

    =ia,jb,ij1F(ij)G(ab/ij)=-\sum\limits_{i|a,j|b,ij≠1}F(ij)G(ab/ij)

    根据所有的a<a; b<ba'<a;\ b'<b时,积性成立得

    =ia,jb,ij1F(i)G(j)F(a/i)G(b/j)=-\sum\limits_{i|a,j|b,ij≠1}F(i)G(j)F(a/i)G(b/j)

    =ia,jb,ij1F(i)G(a/i)F(j)G(b/j)=-\sum\limits_{i|a,j|b,ij≠1}F(i)G(a/i)F(j)G(b/j)

    下面拆分求和号(乘法分配律),这一步有点难。

    $=-\sum\limits_{i|a}F(i)G(a/i)\sum\limits_{j|b,ij≠1}F(j)G(b/j)$

    要求ij1ij≠1,即排除i=j=1i=j=1的情况。

    $=F(1)F(1)G(a)G(b)-\sum\limits_{i|a}F(i)G(a/i)\sum\limits_{j|b}F(j)G(b/j)$

    e=GFe=G*F,得$\sum\limits_{i|a}F(i)G(a/i)\sum\limits_{j|b}F(j)G(b/j)=e(a)e(b)=0$得

    =F(1)F(1)G(a)G(b)=F(1)F(1)G(a)G(b)

    由于积性,根据上文F(1)=1F(1)=1,得

    =G(a)G(b)=G(a)G(b),得证.

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

2.莫反公式的推导:

——推导了μ\mu函数,莫比乌斯反演定理

有两个单变量函数 Ff

设函数 Ff 有如下关系:

F(n)=dnf(d)F(n)=\sum\limits_{d|n}f(d)

理解了上述狄利克雷卷积的定义后,不难发现。

F(n)=dn(1f(d))F(n)=\sum\limits_{d|n}(1*f(d))(废话)

F=IfF=I*f (F函数是元函数和f函数的卷积)

现在如果ff函数易求,那我们可以按照上式算出FF

问题在于,如果即FF函数易求,如何求出ff?

F=IfF=I*f,两边同时乘以I1I^{-1}

f=I1Ff=I^{-1}*F

我们只要想办法求出I1I^{-1}就好了。

大佬Möbius把I1I^{-1}命名为μ\mu

问题在于这个函数里面是什么呢?

μ\mu是个积性函数,因为积性函数的逆还是积性函数。

这里有个小技巧,研究一个积性函数,先研究其在质数的幂时的表现

比如说μ(pk)\mu(p^k)(p是质数)。

k=0时,显然有μ(1)=1\mu(1)=1

k=1时,由于dpI(d)μ(p/d)=e(p)=0\sum\limits_{d|p}I(d)\mu(p/d)=e(p)=0

注意到p为素数,得到I(p)μ(1)+I(1)μ(p)=e(p)=0I(p)\mu(1)+I(1)\mu(p)=e(p)=0

因为μ(1)=1\mu(1)=11+μ(p)=01+\mu(p)=0,即μ(p)=1\large{\mu(p)=-1}

k>1时,由于dpkI(d)μ(pk/d)=e(pk)=0\sum\limits_{d|p^k}I(d)\mu(p^k/d)=e(p^k)=0

注意到p为素数,得到$I(p^k)\mu(1)+I(p^{k-1})\mu(p)+...+I(1)\mu(p^k)=e(p^k)=0$

所有的II都为1,得到μ(1)+μ(p)+μ(p2)...+μ(pk)=0\mu(1)+\mu(p)+\mu(p^2)...+\mu(p^k)=0

代入μ(1)=1,μ(p)=1\mu(1)=1,\mu(p)=-1得到μ(p2)...+μ(pk)=0\mu(p^2)...+\mu(p^k)=0

考虑上式k=2的情况,得到μ(p2)=0\mu(p^2)=0

考虑上式k=3的情况,得到mu(p2)+mu(p3)=0mu(p^2)+mu(p^3)=0也就是mu(p3)=0mu(p^3)=0

……,得到k=任意更大的数时mu(pk)=0mu(p^k)=0

利用数学归纳法,证明了k>1时,μ(pk)=0\mu(p^k)=0

大家缓口气哦,μ\mu函数的终极定义马上就证明出来了。

由于上文积性函数性质2: $\mu(n=p_1^{k_1}p_2^{k_2}...p_m^{k_m})=\mu(p_1^{k_1})\mu(p_2^{k_2})...\mu(p_m^{k_m})$

因为k>1时,μ(pk)=0\mu(p^k)=0

可以想象到当某一个k>1k>1时,μ(n)=0\mu(n)=0

不然的话所有的k=1。

可以想象到μ(n=p1p2...pm)=(1)m\mu(n=p_1p_2...p_m)=(-1)^{m}

mu 函数的定义\color{blue}\text{定义}浮出水面。

现在来介绍莫比乌斯函数是怎么用来反演的。

  • 反演公式:

    • 嵌入式莫比乌斯反演:

      μI=e\mu*I=ednμ(d)=[n=1]\sum\limits_{d|n}\mu(d)=[n=1]

      注意到[nm][n/m=1]=[n=m][n|m][n/m=1]=[n=m]

      则有[nm]d(n/m)μ(d)=[n=m][n|m]\sum\limits_{d|(n/m)}\mu(d)=[n=m]

      初学者可以只掌握这一种。

    • 约数的莫比乌斯反演:

      若:F(n)=dnf(d)\large{F(n)=∑\limits_{d|n}f(d)}

      则:f(n)=dnμ(d)F(n/d)\large{f(n)=∑\limits_{d|n}μ(d)F(n/d)}

      又作f(n)=dnμ(n/d)F(d)f(n)=∑\limits_{d|n}μ(n/d)F(d)(和上面那个式子等价)

      根据μ=I1\mu=I^{-1}fI=Ff=Fμf*I=F\rightarrow f=F*\mu

      如果你们喜欢和式的话:证明2

    • 倍数的莫比乌斯反演:

      若:F(n)=ndf(d)\large{F(n)=∑\limits_{n|d}f(d)}

      则:f(n)=ndμ(d/n)F(d)\large{f(n)=∑\limits_{n|d}μ(d/n)F(d)}

      (这个比较特殊,并不是狄利克雷卷积的形式)

      又作F(n)=kf(kn)F(n)=\sum\limits_{k}^∞f(kn)f(n)=kμ(k)F(kn)f(n)=\sum\limits_{k}^∞\mu(k)F(kn)

      证明:\color{blue}\text{证明:}

      ndμ(n/d)F(d)∑\limits_{n|d}μ(n/d)F(d)

      F(n)F(n)的定义代入。

      =ndμ(n/d)dtf(t)=∑\limits_{n|d}μ(n/d)\sum\limits_{d|t}f(t)

      =kμ(k)nktf(t)=∑\limits_{k}^{∞}μ(k)\sum\limits_{nk|t}f(t)

      第一个求和号对k没有限制,我们交换求和号,考虑枚举t,看有什么对应的k:

      $=∑\limits_{t}f(t)\sum\limits_{nk|t}\mu(k)=∑\limits_{t}f(t)\sum\limits_{k|(t/n),n|t}\mu(k)$

      根据嵌入式反演能得到k(t/n),ntμ(k)=[t=n]\sum\limits_{k|(t/n),n|t}\mu(k)=[t=n]

      =tf(t)[t=n]=f(n)=∑\limits_{t}f(t)[t=n] =f(n),证毕。

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

3.知识储备:

  • 分解质因数求法,单个mu(n)

直接按照定义,分解因数暴力求。

代码被和谐
//Time:O(sqrt(n))
  • 线性筛法,mu(1~n) (正宗)

利用μ\mu函数的积性性质。

想深入学习线性筛法的看这里

#include<iostream>
#include<cstring>
#define MaxNum 10000100
using namespace std;
bool e[MaxNum];
int p[MaxNum],tn,mu[MaxNum],n;
void Mobius()
{
  e[1]=1;mu[1]=1;
  for (int i=2;i<=n;i++){
	if (!e[i]){p[++tn]=i;mu[i]=-1;}
	for (int j=1;j<=tn;j++){
	  if (p[j]*i>n)break;
	  mu[p[j]*i]=i%p[j]==0 ? 0 : -mu[i];
	  e[p[j]*i]=1;
	  if (i%p[j]==0)break;
	}
  }
}
int main()
{
  cin>>n; 
  Mobius();
  for(int i=1;i<=n;++i)
   printf("%d: %d\n",i,mu[i]);
  return 0;
}//Time:O(n)

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

4.第一道题:整除分块

(除了特殊说明,除法均为整除)

讲了那么多,那么问题来了:我们问什么要学莫比乌斯反演?这有什么用呢?

来看一道题目

让你求$\large{\sum\limits_{i=1}^{n}\sum\limits_{j=1}^m[gcd(i,j)=1]}$,也就是互质数对数。(mnm\leq n)

大力两重循环+欧几里得O(n2logn)O(n^2logn)?

悄悄告诉你,正解O(n)O(\sqrt{n})!

$ANS=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^m[(i,j)=1]$。

嵌入式反演替换 : [(i,j)=1]=d(i,j)μ(d)[(i,j)=1]=\sum\limits_{d|(i,j)}\mu(d)

  • 技巧:\color{blue}\text{技巧:}数对(i,j)(i,j)满足[dgcd(i,j)][d|gcd(i,j)]的充要条件是did|idjd|j

    [d(i,j)]=[di][dj][d|(i,j)]=[d|i][d|j], 人话就是 : 即是ii的约数又是jj的约数的数是i,ji,j的公约数。

则有[(i,j)=1]=di,djμ(d)[(i,j)=1]=\sum\limits_{d|i,d|j}\mu(d),这比较重要。

$ANS=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^m\sum\limits_{d|i,d|j}\mu(d)$

技巧:\color{blue}\text{技巧:} 我们考虑交换求和顺序,分别查看每个变量的限制。

dd最先枚举,考虑其范围,显然在[1,n][1,n]以内。

ii必须要满足did|i,且在[1,n][1,n]以内。

jj必须要满足djd|j,且在[1,n][1,n]以内。

$ANS=\sum\limits_{d=1}^n\mu(d)\sum\limits_{d|i}^{n}\sum\limits_{d|j}^m1$

观察后面的$\sum\limits_{d|i}^{n}\sum\limits_{d|j}^m1=(\sum\limits_{d|i}^{n}1)(\sum\limits_{d|j}^m1)$

din1\sum\limits_{d|i}^{n}1相当于nn以内dd的倍数的个数,显然为n/d\lfloor n/d\rfloor

就得到$ANS=\sum\limits_{d=1}^n\mu(d)\lfloor n/d\rfloor\lfloor m/d\rfloor$

这样子就可以O(n)O(n)计算了。

技巧:\color{blue}\text{技巧:}怎么做到O(n)O(\sqrt{n})呢?需要一个叫做整除分块的技巧。

整除分块入门小记

好的,下面我们默认你会整除分块了。

回顾上面的问题,我们已经变形到了$ANS=∑\limits_{d=1}^{min(n,m)}μ(d)\lfloor n/d\rfloor \lfloor m/d\rfloor$

看到和式后面的n/dm/d\lfloor n/d\rfloor \lfloor m/d\rfloor,是可以整除分块的。

问题是还乘了个μ(d)\mu(d),根据套路弄个前缀和搞定。

(如果这句听不懂,把入门小记再看一遍)

μ([l,r])\mu([l,r])的和乘上n/dm/d\lfloor n/d\rfloor \lfloor m/d\rfloor

Code:

#include<iostream>
#define MaxNum 100100
using namespace std;
int p[MaxNum/8],tn,mu[MaxNum],n,m;
bool e[MaxNum];
long long calc(int n,int m)
{
  long long ans=0;
  for (int l=1,r=0;l<=min(n,m);l=r+1){
    r=min(n/(n/l),m/(m/l));// 分段
    ans+=1ll*(mu[r]-mu[l-1])*(n/l)*(m/l);
  }return ans; 
}
int main()
{
    e[1]=1;mu[1]=1;
    for (int i=2;i<=MaxNum;i++){
      if (!e[i]){p[++tn]=i;mu[i]=-1;}
      for (int j=1;j<=tn;j++){
      	if (p[j]*i>MaxNum)break;
      	mu[p[j]*i]=i%p[j]==0 ? 0 : -mu[i];
      	e[p[j]*i]=1;
      	if (i%p[j]==0)break;
      }
    }for (int i=2;i<=MaxNum;i++)mu[i]+=mu[i-1];
    //筛法弄出mu前缀和,参看前文
    cin>>n>>m;
    cout<<calc(n,m)<<endl;
    return 0;
}

后面你会看到,莫比乌斯反演不分块复杂度就是一堆垃圾。

分块是肯定要分块的,这辈子都要分块的

恭喜你,已经在莫比乌斯反演的路上迈出了第一步!

附送可以利用上述代码AC的练手题Link1+Link2

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

5.技巧进阶:莫反常用结论以及练习

莫比乌斯反演是极具技巧性的。

主要的思维难度就建立在反演分块两部分。

看题吧。

第一题P2568 GCD

求$\sum\limits_{i=1}^n\sum\limits_{j=1}^n[(i,j)=prime]$

在上一题中,我们解决了求i=1nj=1n[(i,j)=1]\sum\limits_{i=1}^{n}\sum\limits_{j=1}^n[(i,j)=1]的问题,而且我们已经能够做到O(n)O(\sqrt{n})求解了。

我们尝试求i=1nj=1n[(i,j)=d]\sum\limits_{i=1}^n\sum\limits_{j=1}^n[(i,j)=d]

  • 注意到,[(i,j)=d][(i,j)=d]蕴含did|idjd|j.

=dindjn[(i,j)=d]=\sum\limits_{d|i}^n\sum\limits_{d|j}^n[(i,j)=d]

  • 技巧:\color{blue}\text{技巧:} 既然i,ji,j都是dd的倍数,我们不妨把i,ji,j都除以dd

    此时,后面原有的ii需要还原成idid,原有的jj要还原成jdjd

$=\sum\limits_{i=1}^{n/d}\sum\limits_{j=1}^{n/d}[(id,jd)=d]$

  • [(id,jd)=d]=[d(i,j)=d]=[(i,j)=1][(id,jd)=d]=[d(i,j)=d]=[(i,j)=1]

$=\sum\limits_{i=1}^{n/d}\sum\limits_{j=1}^{n/d}[(i,j)=1]$,又回到了我们熟悉的问题!

求解的复杂度是O(n/d)O(\sqrt{n/d})

对于每个素数求解的复杂度是$O\Big(\sum\limits_{p\in Prime}^{n}{\sqrt{n/p}}\Big)$

=npPrimen1/p=\sqrt{n}\sum\limits_{p\in Prime}^{n}{\sqrt{1/p}}

将素数视为平均分布,可估计额1lognp=1n1/p\frac{1}{\log n}\sum\limits_{p=1}^{n}\sqrt{1/p}

接下来需要一点微积分知识 : p=1n1/p=n\sum\limits_{p=1}^{n}\sqrt{1/p}=\sqrt{n}

总的复杂度就是O(n/logn)O(n/\log n)

对于不会计算复杂度的同学,可以暴力统计一下式子的值,看看能不能过就好了。

Code:

#include<iostream>
#include<cstdio>
#define MaxNum 10000010
using namespace std;
long long p[MaxNum/10],tn,mu[MaxNum+50],anss,ttn,n,aaa;
bool e[MaxNum+50];
void getmu()
{
  e[1]=1;mu[1]=1;
  for (long long i=2;i<=MaxNum;i++){
    if (!e[i])mu[p[++tn]=i]=-1;
  	for (int j=1;j<=tn&&i*p[j]<MaxNum;j++){
	  e[i*p[j]]=1;
  	  mu[i*p[j]]=i%p[j]? -mu[i] : 0;
  	  if (!i%p[j])break;
  	}
  }
} 
//sum(1,N/n)sum(1,N/n)[gcd(i,j)==1]
long long gg(int n){
  long long ans=0;
  for (int l=1,r=0;l<=n;l=r+1){
    r=n/(n/l);			// 分段
    ans+=1ll*(mu[r]-mu[l-1])*(n/l)*(n/l);
  }return ans;
}
int main()
{
  getmu();
  for (int i=2;i<=MaxNum;i++)mu[i]+=mu[i-1];
  cin>>n;
  long long ans=0;
  for (int i=2;i<=n;i++)
   if(!e[i])ans+=gg(n/i);
  cout<<ans;
  return 0;
}

P2257 YY的GCD

貌似和上一题相同呢?发现T<=10000T<=10000

上一题的O(n/logn)O(n/\log n)还要乘上数据组数,肯定是跑不过去的。

我们将上面的最终式子整理:

$\sum\limits_{p∈Prime}^{n}f(p)=\sum\limits_{p∈Prime}^{n}∑\limits_{d=1}^{m/p}μ(d)\lfloor n/dp\rfloor\lfloor m/dp\rfloor$

技巧:\color{blue}\text{技巧:} 现在又有个蛇皮操作叫改变枚举变量

说起dpdp,我就想起……开机……弘扬中华文化。

还是把dpdp换一下吧,就令dp=kdp=k我们枚举k。容易发现dpmin(n,m)dp≤min(n,m)

明显的,ddpp都是k的约数,我们再枚举pp,得到d=k/pd=k/p。(把枚举k的和式放在最前面)

$\sum\limits_{k=1}^{min(n,m)}∑\limits_{p∈prime,p|k}μ(k/p)\lfloor n/k\rfloor\lfloor m/k\rfloor$

我们发现只有μ(k/p)μ(k/p)一项和pp有关,所以我们可以把μ(k/p)μ(k/p)连着pprime,pk∑\limits_{p∈prime,p|k}一起放到最后面。

得到$\sum\limits_{k=1}^{min(n,m)}\lfloor n/k\rfloor\lfloor m/k\rfloor∑\limits_{p∈prime,p|k}μ(k/p)$

前面的$\sum\limits_{k=1}^{min(n,m)}\lfloor n/k\rfloor\lfloor m/k\rfloor$就可以整除分块了。

至于后面的pprime,pkμ(k/p)∑\limits_{p∈prime,p|k}μ(k/p)还是套路,维护一个有关于kk的前缀和。

怎么弄出前缀和,就是考验数论口胡基本功的时候啦,这里也介绍一下。

g(k)=pprime,pkμ(k/p)g(k)=∑\limits_{p∈prime,p|k}μ(k/p)

先线筛出μ\mu,然后枚举pp,对于 pkp|kkkg[k]+=μ(k/p)g[k]+=\mu(k/p)。(贡献模式,好好理解)

这样的话对于一个素数pp,复杂度为O(n/p)O(n/p)

复杂度和埃氏筛相同,为O(nloglogn)O(n\log\log n)

每个询问O(n)O(\sqrt{n}),总的复杂度O(tn+nloglogn)O(t\sqrt{n}+n\log\log n)

亮出代码:

#include<algorithm>
#include<cstdio>
using namespace std;
int t,n,m,tn,p[1000500],mu[10000500],g[10000500];
bool e[10000500];
void getmu()
{
  e[1]=1;mu[1]=1;
  for (int i=2;i<=10000100;i++){
  	if (!e[i]){
  	  p[++tn]=i;
  	  mu[i]=-1;
	}for (int j=1;j<=tn;j++){
	  if (1ll*i*p[j]>10000100)break;
	  e[i*p[j]]=1;
	  mu[i*p[j]]=i%p[j] ? -mu[i] : 0;
	  if (!i%p[j])break;
	}
  }//线筛出mu 
}
long long calc(int n,int m)
{
  long long ans=0;
  int l=1,r;
  for (;l<=min(n,m);l=r+1){
  	r=min(n/(n/l),m/(m/l));//整除分块 
  	ans+=1ll*(n/l)*(m/l)*(g[r]-g[l-1]);
  }return ans;
}
int main()
{
scanf("%d",&t);
getmu();
for (int i=1;i<=tn;i++)
 for (int j=p[i];j<=10000100;j+=p[i])
  g[j]+=mu[j/p[i]];
for (int i=2;i<=10000100;i++)g[i]+=g[i-1];
//预处理前缀和 
while(t--){
  	
  scanf("%d%d",&n,&m);
  printf("%lld\n",calc(n,m)); 
  	
}return 0;}

附加题:\color{blue}\text{附加题:} P5221 Product & My Sol

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

6.探索新知:其他数论函数

想必经过上面的学习,大家对μ\mu已经有了一定的了解,运用反演定理也更熟练了些,那么我们一起向数论函数这个广阔的天地进发吧!

定义:\color{blue}\text{定义:}常用数论函数表:

函数名称 符号 定义 积性 卷积
恒等函数 | I(n)I(n) | 永远等于1 | 完全积性函数 |
元函数 | ϵ(n)ϵ(n)(也作e(n)e(n)) | 当n为1时,函数值为1,否则为0 |
单位函数 | id(n)id(n) | 函数值为n |
幂函数 | idx(n)id^x(n) | 函数值为nxn^x |
莫比乌斯函数 | μ(n)\mu(n)\mu | μI=e\mu*I=e | 积性函数 | μI=e\mu*I=e
欧拉函数| φ(n)\varphi(n)\varphi | 小于等于n的数中,与n互质的数的个数 | φI=id\varphi*I=id
约数个数函数 | d(n)d(n)(也作σ0(n)σ_0(n)) | n的约数个数 | d=IId=I*I
约数和函数 | σ(n)σ(n) | n的约数和 | σ=idIσ=id*I
除数函数 | σk(n)σ^k(n) | n的约数k次方和 | σk=idkIσ^k=id^k*I

1) 欧拉函数

定义:\color{blue}\text{定义:}欧拉函数,φ(n)\varphi(n),其值为“小于等于n的数中,与n互质的数的个数”。

这个函数是可以辅助解(理解)很多的数论题的,它的地位差不多和μ\mu一样重要。

而且,φ\varphiμ\mu之间有某些神秘联系,这一点要等我们先讲完狄利克雷卷积的一些玩法先。

先讲解这个φ\varphi基本操作:

性质:\color{blue}\text{性质:}首先φ\varphi积性函数

证明:\color{blue}\text{证明:}因为φ(n)=i=1n[(n,i)=1]\varphi(n)=\sum\limits_{i=1}^n[(n,i)=1]

(n,m)=1(n,m)=1,

得$\varphi(n)\varphi(m)=\sum\limits_{i=1}^n[(n,i)=1]\sum\limits_{j=1}^m[(m,j)=1]$

即$\sum\limits_{i=1}^n\sum\limits_{j=1}^m[(m,j)=1\ {\bf and}\ (n,i)=1]$

由于互质,[(m,j)=1 and (n,i)=1][(m,j)=1\ {\bf and}\ (n,i)=1]等价于[(nm,im+jn)=1][(nm,im+jn)=1]

因为gcd((im+jn)modn,n)=gcd(im,n)=1\gcd\Big((im+jn)\bmod n,n\Big)=\gcd(im,n)=1,且gcd((im+jn)modm,m)=gcd(jn,m)=1\gcd\Big((im+jn)\bmod m,m\Big)=\gcd(jn,m)=1

我们还要证明所有的(in+jm)modnm(in+jm)\bmod {nm}恰好组成[1...nm][1...nm]的集合。

首先,这些二元组的大小为nmnm,和目标集合大小相同,我们只需要证明这些元素两两不同即可。

前置芝士 : ca=cb(modp)ca=cb\pmod p(c,p)=1(c,p)=1,则有a=ba=b. (可见同余系基本定理1)

  • 采用反证法,假如有am+bn=cm+dn(modnm)am+bn=cm+dn\pmod {nm}

    我们将两边对mm取模得到bn=dn(modm)bn=dn\pmod {m},由引理得b=db=d,同理有a=ca=c,矛盾。

那么(in+jm)modnm(in+jm)\bmod {nm}的集合与[1...nm][1...nm]的集合一一对应,且贡献模式相同。

于是上式等价于i=1nm[(nm,i)=1]=φ(nm)\sum\limits_{i=1}^{nm}[(nm,i)=1]=\varphi(nm)

如何求积性函数的前n个值呢?

线性筛!

对于线性筛,我们要解决φ(primek)\varphi(prime^k)类的函数值。(下面的pp均为素数)

性质:\color{blue}\text{性质:} φ(pk)=(p1)p(k1)\varphi(p^k)=(p-1)p^{(k-1)}

证明:\color{blue}\text{证明:}

φ(p)=p1\varphi(p)=p-1,这是很明显的:小于pp的数都与pp互质。

很明显pkp^k以内的数与pkp^k互质的充要条件是:它们没有公因数pp

那么把所有含有因数pp的数去掉,剩下(p1)pkp=(p1)p(k1)\dfrac{(p-1)*p^k}{p}=(p-1)p^{(k-1)}个。

在实用中这个定理有另外一个形式:

如果pnp|n,则φ(np)=φ(n)p\varphi(np)=\varphi(n)*p

证明:\color{blue}\text{证明:}n=pkmn=p^k*m,那么$\varphi(n)=\varphi(m)*\varphi(p^k)=\varphi(m)*(p-1)p^{(k-1)}$

np=p(k+1)mnp=p^{(k+1)}*m,那么$\varphi(np)=\varphi(m)*\varphi(p^{(k+1)})=\varphi(m)*(p-1)p^k$

原命题明显成立。

Code:

bitset<MaxN> e;
int p[MaxN/10],tn;
long long ans,phi[MaxN];
void getphi()
{
  phi[1]=1;
  for (int i=2;i<=n;i++){
    if (!e[i]){
      p[++tn]=i;
      phi[i]=i-1;
    }for (int j=1,t;j<=tn&&(t=i*p[j])<=n;j++){
      e[t]=1;
      phi[t]=phi[i]*(i%p[j]?p[j]-1:p[j]);
      //此处注意
      if (i%p[j]==0)break;
    }
  }
}
  • 代码里"此处注意":

    如果(i,p)=1(i,p)=1,则φ(ip)=φ(i)φ(p)=(p1)φ(i)\varphi(ip)=\varphi(i)*\varphi(p)=(p-1)\varphi(i)

    如果pip|i,根据上文的定理,φ(ip)=φ(i)p\varphi(ip)=\varphi(i)*p

  • 附: 有些时候我们需要求出单个的φ(n)\varphi(n),如果按照定义大力求,至少得O(n)O(n)gcd\gcd

    我们把nn分解得p1k1p2k2...pmkmp_1^{k_1}*p_2^{k_2}*...*p_m^{k_m}

    那么$\varphi(n)=\varphi(p_1^{k_1})*\varphi(p_2^{k_2})*...*\varphi(p_m^{k_m})=\dfrac{(p_1-1)p_1^k}{p_1}*\dfrac{(p_2-1)p_2^k}{p_2}*...\dfrac{(p_m-1)p_m^k}{p_m}$

    $=(p_1^kp_2^{k_2}...p_m^{k_m})*\left(\dfrac{p_1-1}{p_1}*\dfrac{p_2-1}{p_2}*...*\dfrac{p_m-1}{p_m}\right)=n\left(\dfrac{p_1-1}{p_1}*\dfrac{p_2-1}{p_2}*...*\dfrac{p_m-1}{p_m}\right)$

    性质:\color{blue}\text{性质:} $\varphi(n=p_1^kp_2^{k_2}...p_m^{k_m})=n\left(\dfrac{p_1-1}{p_1}*\dfrac{p_2-1}{p_2}*...*\dfrac{p_m-1}{p_m}\right)$

    根据上式,把nn质因数分解即可求出φ(n)\varphi(n),复杂度O(n)O(\sqrt{n})

    Code:

int phi(int n)
{
  int ans=n;
  for (int i=2;i*i<=n;i++)
   if (n%i==0){
   	 ans=ans/i*(i-1);
     //根据上文式子计算
   	 while(n%i==0)n/=i;
   }
  if (n>1)ans=ans/n*(n-1);
  //如果分解不尽,那么肯定还剩一个素数
  return ans;
}

我们来看看φ\varphi的经典应用:

题目

相信你能直接想到一个莫比乌斯反演的做法:

  • f(n)f(n)i=1nj=1n[(i,j)=1]\sum\limits_{i=1}^n\sum\limits_{j=1}^n[(i,j)=1]

    考虑枚举gcd那么答案是$\sum\limits_{d=1}^nd\sum\limits_{i=1}^n\sum\limits_{j=1}^n[(i,j)=d]$

    后面的$\sum\limits_{i=1}^n\sum\limits_{j=1}^n[(i,j)=d]=\sum\limits_{i=1}^{(n/d)}\sum\limits_{j=1}^{(n/d)}[(i,j)=1]=f(n/d)$

    答案化为d=1ndf(n/d)\sum\limits_{d=1}^nd*f(n/d)

    f(n)f(n)反演,……即为d=1nμ(d)(n/d)2∑\limits_{d=1}^{n}μ(d)(n/d)^2,用整除分块求一次ff时间复杂度O(n)O(\sqrt{n})

    d=1ndf(n/d)\sum\limits_{d=1}^nd*f(n/d)计算即可O(nn)O(n\sqrt{n})

    考虑对f(n/d)f(n/d)n/dn/d整除分块,即可O(n)O(n3/4)O(n)-O(n^{3/4})(方法参照上文,证明需用积分)。

其实利用φ\varphi可以很方便地解决上述问题,复杂度是O(n)O(n)O(n)-O(\sqrt{n})

f(n)f(n)i=1nj=1n[(i,j)=1]\sum\limits_{i=1}^n\sum\limits_{j=1}^n[(i,j)=1]

我们知道φ(n)\varphi(n)的定义是:小于等于n的数中,与n互质的数的个数。

我们把φ(1)+φ(2)+...+φ(n)\varphi(1)+\varphi(2)+...+\varphi(n)加起来,则可以得到每个数与自己更小的数互质的次数和

即$\sum\limits_{i=1}^n\sum\limits_{j=1}^i[(i,j)=1]=\sum\limits_{i=1}^n\varphi(i)$

现在,每个数只能统计比自己小的互质产生贡献,也就是,只统计了数对(x,y)(x,y)x>=yx>=y的部分。

我们考虑(x,y)(x,y)x<=yx<=y的部分贡献,显然和上式相同。

(想像一个邻接矩阵)

乘以22就好了,但是由于(1,1)=1(1,1)=1会多算一次,所以答案减1。

技巧:\color{blue}\text{技巧:}得到$\sum\limits_{i=1}^n\sum\limits_{j=1}^n[(i,j)=1]=2\left(\sum\limits_{i=1}^n\varphi(i)\right)-1$

我们设S(n)=i=1nφ(i)S(n)=\sum\limits_{i=1}^n\varphi(i)(前缀和),上式变为f(n)=2s(n)1f(n)=2*s(n)-1

答案变为$\sum\limits_{d=1}^nd*f(n/d)=\sum\limits_{d=1}^nd*(2*S(n/d)-1)$已经可以做到O(n)O(n)了,再整除分快一次就可以O(n)O(\sqrt{n})了。

然后使用线性筛就得到O(n)O(n)O(n)-O(\sqrt{n})的算法了。

Code:

#include<cstdio>
#include<bitset>
#define MaxN 10000500
using namespace std;
int n;
bitset<MaxN> e;
int p[MaxN/10],tn;
long long ans,phi[MaxN];
void getphi()
{
  phi[1]=1;
  for (int i=2;i<=n;i++){
    if (!e[i]){
      p[++tn]=i;
      phi[i]=i-1;
    }for (int j=1,t;j<=tn&&(t=i*p[j])<=n;j++){
      e[t]=1;
      phi[t]=phi[i]*(i%p[j]?p[j]-1:p[j]);
      if (i%p[j]==0)break;
    }
  }
}
int main()
{
  scanf("%d",&n);
  getphi();
  for (int i=1;i<=n;i++)phi[i]+=phi[i-1];
  for (int i=1;i<=n;i++)ans+=(phi[n/i]*2-1)*i;
  printf("%lld",ans);
}

这个解法相对莫比乌斯反演有什么好处呢?

代码短啊!

如果多组询问的话,就可以使用数论分块O(n)O(\sqrt{n})回答啦。

重申经典结论:$\sum\limits_{i=1}^n\sum\limits_{j=1}^n[(i,j)=1]=\left(\sum\limits_{i=1}^n\varphi(i)*2\right)-1$

既然欧拉函数这么好用,为啥还要反演呢?

i=1nj=1m(i,j)\sum\limits_{i=1}^n\sum\limits_{j=1}^m(i,j)? 欧拉函数就没法直接按照定义做了。

这么说太过于人类智慧了,下面,我们考虑使用狄利克雷卷积来系统分析。

2)一些狄利克雷卷积结论:

  • id=Iφid=I*\varphi

dnφ(d)=n\sum\limits_{d|n}\varphi(d)=n

这个东西是比较重要的,相应地,证明也很长。

证明:\color{blue}\text{证明:}idφ=Fid*\varphi=F

我们知道FF是个积性函数,那么我们只要证明所有的F(primek)=primekF(prime^k)=prime^k成立。

然后根据积性和唯一分解定理,把结论扩展到全体正整数。

$\sum\limits_{d|p^k}\varphi(d)=\varphi(1)+\varphi(p)+\varphi(p^2)+...+\varphi(p^k)$

根据φ(pk)=(p1)p(k1)\varphi(p^k)=(p-1)p^{(k-1)},φ(1)=1\varphi(1)=1

=1+(p1)+(p1)p+(p1)p2...+(p1)p(k1)=1+(p-1)+(p-1)p+(p-1)p^2...+(p-1)p^{(k-1)}

=1+(p1)(1+p+p2+...p(k1))=1+(p-1)(1+p+p^2+...p^{(k-1)})

=1+(p1)pk1p1=pk=1+(p-1)\dfrac{p^k-1}{p-1}=p^k

证毕。

根据I1=μI^{-1}=\mu,可得id=Iφid=I*\varphi等价于μid=φ\mu*id=\varphi

dnμ(d)(n/d)=φ(n)\sum\limits_{d|n}\mu(d)(n/d)=\varphi(n)

这个结论极其有用,比如说我们求i=1nj=1m(i,j)\sum\limits_{i=1}^n\sum\limits_{j=1}^m(i,j)

利用莫比乌斯反演,变形为$\sum\limits_{d=1}^nd*∑\limits_{t=1}^{n/d}μ(t)\lfloor n/dt\rfloor\lfloor m/dt\rfloor$

p=dtp=dt,上式即为

$=\sum\limits_{d=1}^nd*∑\limits_{d|p}^{n}μ(p/d)\lfloor n/p\rfloor\lfloor m/p\rfloor$

可以交换求和号,得到

$=∑\limits_{p=1}^{n}\sum\limits_{d|p}d*μ(p/d)\lfloor n/p\rfloor\lfloor m/p\rfloor$

发现中间的dpdμ(p/d)\sum\limits_{d|p}d*μ(p/d)就是μid\mu*id所以等于φ(p)\varphi(p)

$=∑\limits_{p=1}^{n}\varphi(p)\lfloor n/p\rfloor\lfloor m/p\rfloor$

(这个式子是可以整除分块的)

这样就可以解决上文留下的问题了。

3)除数函数相关

  • d=IId=I*I ;

证明:\color{blue}\text{证明:} $d(n)=\sum\limits_{d|n}1=\sum\limits_{d|n}I(d)I(n/d)=(I*I)(n)$

  • σ=idIσ=id*I

证明:\color{blue}\text{证明:} $d(n)=\sum\limits_{d|n}d=\sum\limits_{d|n}id(d)I(n/d)=(id*I)(n)$

nn分解得到p1k1p2k2...pmkmp_1^{k_1}*p_2^{k_2}*...*p_m^{k_m}

d(n)=(k1+1)(k2+1)...(km+1)d(n)=(k_1+1)(k_2+1)...(k_m+1)

证明:\color{blue}\text{证明:}对于每个素因子可以选0~k个,乘法原理。

$σ(n)=(1+p_1+p_1^2+...+p_1^{k_1})(1+p_2+p_2^2+...+p_2^{k_2})...(1+p_m+p_m^2+...+p_m^{k_m})$

$=(\dfrac{p_1^{(k_1+1)}-1}{p_1-1})(\dfrac{p_2^{(k_2+1)}-1}{p_2-1})...(\dfrac{p_m^{(k_m+1)}-1}{p_m-1})$

证明:\color{blue}\text{证明:}对于每个素因子可以选0~k个,拆完括号后刚好得到所有约数。

另外:$\sum\limits_{i=1}^nd(n)=\sum\limits_{i=1}^n\left\lfloor\dfrac{n}{i}\right\rfloor$

证明:\color{blue}\text{证明:}考虑ii在1~n中被作为约数的次数,得ni\left\lfloor\dfrac{n}{i}\right\rfloor次。

一道题目

4)一些(跳跃性)结论

在做某些毒瘤题的时候有奇效。

  • 莫比乌斯函数μ(n)\mu(n)

μ(ij)=μ(i)μ(j)[ij]\mu(ij)=\mu(i)\mu(j)[i\perp j]

这个容易,假如(i,j)(i,j)大于1,那么一定会导致出现平方因子,式子的值为0.

否则按照积性分解即可。

  • 除数函数d(n)d(n)

d(ij)=xiyj[xy]d(ij)=\sum\limits_{x|i}\sum\limits_{y|j}[x\perp y]

证明:\color{blue}\text{证明:}

比较难,只会从右边推到左边。

ii分解得到p1k1p2k2...pmkmp_1^{k_1}*p_2^{k_2}*...*p_m^{k_m},jj分解得到p1k1p2k2...pmkmp_1^{k_1'}*p_2^{k_2'}*...*p_m^{k_m'}

d(ij)=(k1+k1+1)(k2+k2+1)...(km+km+1)d(ij)=(k_1+k_1'+1)(k_2+k_2'+1)...(k_m+k_m'+1)

显然,每个质因子是独立的,我们考虑i=pa;j=pbi=p^a;j=p^b的情况。

$\sum\limits_{x|i}\sum\limits_{y|j}[x\perp y]=\sum\limits_{x'=0}^a\sum\limits_{y'=0}^b[x',y'\text{不同时为正}]$

大眼观察可得只有 xx'0...a0...a,且yy'取0这a+1a+1个,

yy'0...b0...b,且xx'取0这b+1b+1个,减去重复算的(0,0)(0,0),正好是(a+b+1)(a+b+1),符合要求。

  • 欧拉函数φ(n)\varphi(n)

有$\varphi(ij)=\dfrac{\varphi(i)\varphi(j)(i,j)}{\varphi((i,j))}$

证明:\color{blue}\text{证明:}

默认pp指质数。

φ(ij)=ijpijp1p\varphi(ij)=ij\prod\limits_{p|ij}\dfrac{p-1}{p}

考虑到[pij]=[pi or pj]=[pi]+[pj][p(i,j)][p|ij]=[p|i\ or\ p|j]=[p|i]+[p|j]-[p|(i,j)]

$=ij\left(\dfrac{\prod\limits_{p|i}\dfrac{p-1}{p}\prod\limits_{p|j}\dfrac{p-1}{p}}{\prod\limits_{p|(i,j)}\dfrac{p-1}{p}}\right)$

$=\dfrac{i\prod\limits_{p|i}\dfrac{p-1}{p}j\prod\limits_{p|j}\dfrac{p-1}{p}(i,j)}{(i,j)\prod\limits_{p|(i,j)}\dfrac{p-1}{p}}$

=φ(i)φ(j)(i,j)φ((i,j))=\dfrac{\varphi(i)\varphi(j)(i,j)}{\varphi((i,j))}