莫比乌斯反演

莫比乌斯函数定义

μ(n)={1n=10n(1)kk  n 

性质

  • 莫比乌斯函数不仅是积性函数,还有如下性质:

d|nμ(d)={1n=10n1

d|nμ(d)=ε(n),μ1=ε

补充结论

反演结论[gcd(i,j)=1]=d|gcd(i,j)μ(d)

利用 ε 函数[gcd(i,j)=1]=ε(gcd(i,j))

线性筛

  • 由于 μ 是积性函数,因此可以线性筛莫比乌斯函数(线性筛基本可以求所有的积性函数,尽管方法可能不同)
// C++ Version
void getMu() {
  mu[1] = 1;
  for (int i = 2; i <= n; ++i) {
    if (!flg[i]) p[++tot] = i, mu[i] = -1;
    for (int j = 1; j <= tot && i * p[j] <= n; ++j) {
      flg[i * p[j]] = 1;
      if (i % p[j] == 0) {
        mu[i * p[j]] = 0;
        break;
      }
      mu[i * p[j]] = -mu[i];
    }
  }
}

扩展

证明:

φ1=id

对于欧拉函数有一个性质,id(n)=d|nφ(d)

那么以狄利克雷卷积的形式写出来,φ1=id

两边同时卷上 μ ,那么 φε=idμ ,那么 φ(n)=d|ndμ(nd)

莫比乌斯变换

f(n),g(n) 为两个数论函数

形式一:

  • 如果有 f(n)=d|ng(d) ,那么有 g(n)=d|nμ(d)f(nd)

  • 这种形式下,数论函数 f(n) 称为数论函数 g(n) 的莫比乌斯变换,数论函数 g(n) 称为数论函数 f(n) 的逆莫比乌斯变换(反演)

  • 数论函数的 g(n) 的莫比乌斯变换就是 g(n)1

形式二:

  • 如果有 f(n)=n|dg(d),那么 g(n)=n|dμ(dn)f(d)

证明:

  • 对于 g(n)=d|nμ(d)f(nd) ,带入 f(n)=d|ng(d) ,然后变换求和顺序,最后通过 μ 来变换

问题形式

「HAOI 2011」Problem b

  • 首先可以将这个拆成四个前缀,那么我们要求的就是

i=1nj=1m[gcd(i,j)=k]=i=1n/kj=1m/k[gcd(i,j)=1]=i=1n/kj=1m/kd|gcd(i,j)μ(d)=dμ(d)nkdmkd

  • 最后的实际上是有关 nd ,那么就可以整除分块了

SP5971 LCMSUM - LCM Sum

  • 首先肯定可以变成这样 ni=1nigcd(i,n)
  • 还是考虑枚举 gcd ,那么最后会变成 nd|ni=1n/di[gcd(i,n/d)=1]
  • 注意到这里的含义是 [1,n/d] 中和 [n/d] 互质的数的和,而 n/d 也是 n 的一个因子,那么就等价于
  • nd|ni=1di[gcd(i,d)]=1
  • 仍然是注意到上面的含义,有关 [1,d] 中和 d 互质的数的和,互质的数是一对对的,如果 xd 互质,那么 dx 一定和 d 互质,所以这个和就是 dφ(d)2
  • 那么答案就是 nd|ndφ(d)2
  • 第一种方法是 O(nlnn) 预处理出所有范围内的值,因为 O(n×(11+12+....))O(nlnn)
  • 第二种方法是线性筛出来所有的 f(n)=nd|ndφ(d)2,注意到这个函数是个积性函数,而大部分的积性函数是可以做到线性筛的
  • 下面进行推导
  • 假设 n=p1c1p2c2... ,那么 f(pc)=w=0cpwφ(pw)=(p1)w=0cp2w1
  • 那么 g(pc+1)=g(pc)+p2c+1×(p1)
  • i=a×pc,c>0,ap ,那么 g(i×p)=g(a)×g(pc+1),g(i)=g(a)×g(pc)
  • g(i×p)g(i)=g(a)×p2c+1×(p1)
  • 同理有 g(i)g(i/p)=g(a)×p2c1×(p1)
  • 那么 g(i×p)=g(i)+(g(i)g(i/p))×p2

参考:

void solve() {
  g[1] = 1;
  for (int i = 2; i <= N; ++i) {
    if (!flg[i]) {
      p[++tot] = i;
      g[i] = (long long)1 * i * (i - 1) + 1;
    }
    for (int j = 1; j <= tot && i * p[j] <= N; ++j) {
      flg[i * p[j]] = 1;
      if (i % p[j] == 0) {
        g[i * p[j]] =
            g[i] + (g[i] - g[i / p[j]]) * p[j] * p[j];  // 代入推出来的式子
        break;
      }
      g[i * p[j]] = g[i] * g[p[j]];
    }
  }
}
  • 如果已经确实是积性函数了,那么就考虑最小质因数的个数 >=2 的情况就可以了
  • 大概的步骤:
    1. 首先求出质数的幂的答案
    2. 然后设 i=a×pc,c>0,ap
    3. 那么 g(i)=g(a)×g(pc)
    4. 那么 g(i×p)=g(a)×g(pc+1)
    5. 然后算出 g(i×p)g(i)
    6. 算出 g(i)g(i/p)
    7. 两个式子相互推一下,就可以得到 g(i×p) 的表示式
  • 欧拉函数有一个性质 φ(pk)=pkpk1 ,质数的表示式是可以变换的,所以这里先求出质数的答案

P1829 [国家集训队]Crash的数字表格 / JZPTAB

  • 首先变成 d=1min(n,m)di=1n/dj=1m/dij[gcd(i,j)=1]
  • 将后面的部分提取出来,i=1nj=1mij[gcd(i,j)=1]
  • 这个东西还是考虑变换,也就是变成 dμ(d)di=1n/dj=1n/dij
  • 仍然将后面的部分提出来,i=1nj=1mij ,就是 (i=1ni)(j=1mj)
  • 那么再放回去,就会发现就是数论分块套数论分块,那么整体的复杂度 O(n)
  • 我一开始还以为要 O(n) 线性筛函数,然后就越来越跑偏

P3327 [SDOI2015]约数个数和

  • 首先要知道 d(xy)=i|xj|y[gcd(i,j)=1]
  • 先推出这样个式子:dμ(d)k1=1n/dk2=1m/dnk1dmk2d
  • 将后面的提出来,就是 i=1nj=1mnimj
  • 那么 O(nn) 预处理出 f(n)=i=1nni
  • 那么原式子就可以在 O(Tn) 做完
posted @   Kzos_017  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示