莫比乌斯反演

莫比乌斯反演

一、线性筛

void init() 
{
    v[1]=mu[1]=phi[1]=1;
    int cnt=0;
    for (int i=2;i<=MAXN;++i) 
	{
        if (!v[i]) p[++cnt]=i,mu[i]=-1,phi[i]=i-1;
        for (int j=1;j<=cnt&&i*p[j]<=MAXN;++j) 
		{
            v[i*p[j]]=1;
            if (i%p[j]) mu[i*p[j]]=-mu[i],phi[i*p[j]]=phi[i]*phi[p[j]];
            else 
			{ 
				mu[i*p[j]]=0,phi[i*p[j]]=phi[i]*p[j]; 
				break; 
			}
        }
    }
    for (int i=1;i<=MAXN;++i) mu[i]+=mu[i-1],phi[i]+=phi[i-1];
}

二、整数分块(整除分块/数论分块)

1.功能:求\(\sum_{i=1}^n\lfloor\dfrac{n}{i} \rfloor\)

2.引理:集合\(\{\dfrac{n}{i}\}\)元素个数\(\le2\sqrt{n}\)。证明分类讨论一下即可。

3.使用:对于一些\(\lfloor\dfrac{n}{i} \rfloor\)相等的值分块处理。找到左端点\(l\)与右端点\(r\)即可。

最重要的结论:当\(\lfloor\dfrac{n}{i} \rfloor=\lfloor\dfrac{n}{i'} \rfloor\)时,\(i'\)的最大值为\(\lfloor\dfrac{n}{\lfloor\frac{n}{i} \rfloor} \rfloor\)

4.运用:例子: [CQOI2007]余数求和

\(ans=\sum_{i=1}^n(k\mod i)=\sum_{i=1}^n(k-i*\lfloor\dfrac{k}{i} \rfloor)\)。拆开后整数分块。

三、积性函数(可乘函数)

1.定义:若定义在\(x∈N^*\)上函数\(f\)满足若\(gcd(x,y)=1\)\(f(x*y)=f(x)*f(y)\),则称\(f\)为积性函数。

2.举例:\(\sigma\)\(\varphi\)\(\mu\)与其他完全积性函数(见第六大点)。

四、莫比乌斯函数 \(μ\)

1.定义:

2.性质

  • 莫比乌斯函数是积性函数。
  • 对于\(n≠1\),\(ε(n)=\sum_{d|n}μ(d)=0\)

五、莫比乌斯反演

1.若\(f(n)=\sum_{d|n}g(d)\),那么\(g(n)=\sum_{d|n}μ(d)f(\dfrac{n}{d})=\sum_{d|n}μ(\dfrac{n}{d})f(d)\)

2.变形

  • \(f(n)=\sum_{d|n}g(d)\),则\(g(n)\)是积性函数的充分必要条件是\(f(n)\)是积性函数。

  • \(f(x)=\sum_{d=1}^{\lfloor\frac{n}{x} \rfloor}g(d\times x)\),则\(g(x)=\sum_{d=1}^{\lfloor\frac{n}{x} \rfloor}f(d\times x)\times μ(d)\)

  • \(f(x)=\sum_{x|d,d\le n}g(d)\),则\(g(x)=\sum_{x|d,d\le n}f(d)*μ(\dfrac{d}{x})\)

  • 当反演公式中大量出现两个数的乘积时,珂以换元将它变为一个整体

  • 枚举一个新的变量以简化求和公式

3.运用

先容斥一发,转化为处理\(\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=k]\)

化简为:\(\sum_{i=1}^{\lfloor\frac{n}{k} \rfloor}\sum_{j=1}^{\lfloor\frac{m}{k} \rfloor}[gcd(i,j)=1]\)

发现后面的东西可以用\(ε\)函数替换掉。化简为:\(\sum_{i=1}^{\lfloor\frac{n}{k} \rfloor}\sum_{j=1}^{\lfloor\frac{m}{k} \rfloor}ε(gcd(i,j))\)

展开\(ε\)函数:\(\sum_{i=1}^{\lfloor\frac{n}{k} \rfloor}\sum_{j=1}^{\lfloor\frac{m}{k} \rfloor}\sum_{d|gcd(i,j)}μ(d)\)

变换求和顺序:\(\sum_{d=1}μ(d)\sum_{i=1}^{\lfloor\frac{n}{k} \rfloor}[d|i]\sum_{j=1}^{\lfloor\frac{m}{k} \rfloor}[d|j]\)

化简:\(\sum_{d=1}μ(d)\lfloor\dfrac{n}{kd} \rfloor\lfloor\dfrac{m}{kd} \rfloor\)

整数分块即可。

\(\sum_{i=1}^n\sum_{j=1}^m lcm(i,j)\)

等价于:$ \sum_{i=1}n\sum_{j=1}m\frac{i\cdot j}{\gcd(i,j)} $。

枚举最大公约数\(d\): $\sum_{i=1}n\sum_{j=1}m\sum_{d\mid i,d\mid j,\gcd(\frac{i}{d},\frac{j}{d})=1}\frac{i\cdot j}{d} $

把枚举\(d\)放到外面$ \sum_{d=1}^n d\cdot\sum_{i=1}{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}\rfloor}[\gcd(i,j)=1]\ i\cdot j $

记$ \operatorname{sum}(n,m)=\sum_{i=1}n\sum_{j=1}m [\gcd(i,j)=1]\ i\cdot j $

化简$ \sum_{d=1}^n\sum_{d\mid i}^n\sum_{d\mid j}^m\mu(d)\cdot i\cdot j = \sum_{d=1}^n\mu(d)\cdot d2\cdot\sum_{i=1}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}i\cdot j $

所以$ \operatorname{sum}(n,m)=\sum_{d=1}^n\mu(d)\cdot d^2\cdot g(\lfloor\frac{n}{d}\rfloor,\lfloor\frac{m}{d}\rfloor) $

$ g(n,m)=\sum_{i=1}n\sum_{j=1}m i\cdot j=\frac{n\cdot(n+1)}{2}\times\frac{m\cdot(m+1)}{2} $

回代$ \sum_{d=1}^n d\cdot\operatorname{sum}(\lfloor\frac{n}{d}\rfloor,\lfloor\frac{m}{d}\rfloor) $。

六、狄利克雷卷积(Dirichlet)

1.定义:两个函数的狄利克雷卷积为\((f*g)(n)=\sum_{d|n}f(d)g(\frac{n}{d})\)

2.性质:交换律、结合律、分配律。

3.一些积性函数:

  • \(ϵ(n)=[n=1]\)

  • \(I(n)=1\)

  • \(id(n)=n\)

4.狄利克雷卷积的一些式子:

  • \(f*ϵ=f\)

  • \(I*\mu =ϵ\)

  • \(\mu *id=φ\)

  • \(φ*I=id\)

  • \(I*id=σ\)

七、杜教筛

现在需要求积性函数\(f\)的前缀和。考虑构造一个积性函数\(g\),求出\(f*g\)的前缀和。

\(S(n)=\sum_{i=1}^nf(i)\)

\(\sum_{i=1}^n(f*g)(i)\)

\(=\sum_{i=1}^n\sum_{d|i}g(d)f(\frac{i}{d})\)

\(=\sum_{d=1}^ng(d)\sum_{i=1}^{\lfloor\frac{n}{d} \rfloor}f(i)\)

\(=\sum_{d=1}^ng(d)S(\lfloor\dfrac{n}{d} \rfloor)\)

考虑到\(g(1)S(n)=\sum_{i=1}^n(f*g)(i)-\sum_{d=2}^ng(d)S(\lfloor\dfrac{n}{d} \rfloor)\)

所以找到\(g\)使得可以计算\(f*g\)\(g\)的前缀和即可算出\(S(n)\)

ll getSum (int n) { // 算 f 前缀和的函数
  if (n<=MAXN) return x[n];//线性筛范围内
  if (Sumx[n]) return Sumx[n];//记忆化
  ll ans = f_g_sum(n); // 算 f * g 的前缀和
  // 以下这个 for 循环是数论分块
  for (ll l=2,r;l<=n;l=r+1) { // 注意从 2 开始
    r=(n /(n/l)); 
    ans-=(g_sum(r)-g_sum(l - 1))*getSum(n / l);
    // g_sum 是 g 的前缀和
    // 递归 GetSum 求解
  } 
  return Sumx[n]=ans; 
}

接下来几个例子:

  • \(\sigma\)的前缀和 (\(\sigma(i)\)表示\(i\)所有约数和)

  • \(\varphi\)的前缀和 (\(\varphi(i)\)表示比\(i\)小且与\(i\)互质的个数)

考虑到利用\(φ*I=id\)。所以令\(f=φ,g=I,f*g=id\)

  • \(\mu\)的前缀和

考虑到利用\(I*\mu =ϵ\)。所以令\(f=\mu,g=I,f*g=ϵ\)

posted @ 2020-10-24 23:16  Little09  阅读(108)  评论(0)    收藏  举报