莫比乌斯反演

莫比乌斯函数定义

\[\mu(n)= \begin{cases} 1 &n=1\\ 0 &n 含有平方因子\\ (-1)^k & k\space为\space n\space 的本质不同质因子个数 \end{cases} \]

性质

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

\[\sum_{d|n}\mu(d)= \begin{cases} 1 &n=1\\ 0 &n\ne 1 \end{cases} \]

即 $\sum_{d|n}\mu (d)=\varepsilon(n),\mu *1=\varepsilon $

补充结论

反演结论\([\gcd(i,j)= 1]=\sum_{d|gcd(i,j)}\mu(d)\)

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

线性筛

  • 由于 \(\mu\) 是积性函数,因此可以线性筛莫比乌斯函数(线性筛基本可以求所有的积性函数,尽管方法可能不同)
// 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];
    }
  }
}

扩展

证明:

\[\varphi * 1=\operatorname{id} \]

对于欧拉函数有一个性质,\(\operatorname{id(n)}=\sum_{d|n}\varphi(d)\)

那么以狄利克雷卷积的形式写出来,\(\varphi * 1=\operatorname{id}\)

两边同时卷上 \(\mu\) ,那么 \(\varphi * \varepsilon=\operatorname{id}*\mu\) ,那么 \(\varphi (n)=\sum_{d|n} d \cdot \mu(\frac{n}{d})\)

莫比乌斯变换

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

形式一:

  • 如果有 \(f(n)=\sum_{d|n} g(d)\) ,那么有 \(g(n)=\sum_{d|n}\mu(d)f(\frac{n}{d})\)

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

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

形式二:

  • 如果有 \(f(n)=\sum_{n|d}g(d)\),那么 \(g(n)=\sum_{n|d}\mu(\frac{d}{n})f(d)\)

证明:

  • 对于 \(g(n)=\sum_{d|n}\mu(d)f(\frac{n}{d})\) ,带入 \(f(n)=\sum_{d|n}g(d)\) ,然后变换求和顺序,最后通过 \(\mu\) 来变换

问题形式

「HAOI 2011」Problem b

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

\[\begin{aligned} \sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=k]&=\sum_{i=1}^{n/k}\sum_{j=1}^{m/k}[\gcd(i,j)=1]\\ &=\sum_{i=1}^{n/k}\sum_{j=1}^{m/k}\sum_{d|\gcd(i,j)}\mu(d)\\ &=\sum_d\mu(d)\lfloor\frac{n}{kd}\rfloor\lfloor\frac{m}{kd}\rfloor \end{aligned} \]

  • 最后的实际上是有关 \(\lfloor\frac{n}{d}\rfloor\) ,那么就可以整除分块了

SP5971 LCMSUM - LCM Sum

  • 首先肯定可以变成这样 \(n\sum_{i=1}^n\frac{i}{\gcd(i,n)}\)
  • 还是考虑枚举 \(\gcd\) ,那么最后会变成 \(n\sum_{d|n}\sum_{i=1}^{n/d}i[\gcd(i,n/d)=1]\)
  • 注意到这里的含义是 \([1,n/d]\) 中和 \([n/d]\) 互质的数的和,而 \(n/d\) 也是 \(n\) 的一个因子,那么就等价于
  • \(n\sum_{d|n}\sum_{i=1}^di[\gcd(i,d)]=1\)
  • 仍然是注意到上面的含义,有关 \([1,d]\) 中和 \(d\) 互质的数的和,互质的数是一对对的,如果 \(x\)\(d\) 互质,那么 \(d-x\) 一定和 \(d\) 互质,所以这个和就是 \(\frac{d\varphi(d)}{2}\)
  • 那么答案就是 \(n\sum_{d|n}\frac{d\varphi(d)}{2}\)
  • 第一种方法是 \(O(n\ln n)\) 预处理出所有范围内的值,因为 \(O(n\times(\frac{1}{1}+\frac{1}{2}+....))-O(n\ln n)\)
  • 第二种方法是线性筛出来所有的 \(f(n)=n\sum_{d|n}\frac{d\varphi(d)}{2}\),注意到这个函数是个积性函数,而大部分的积性函数是可以做到线性筛的
  • 下面进行推导
  • 假设 \(n=p_1^{c_1}p_2^{c_2}...\) ,那么 \(f(p^c)=\sum_{w=0}^cp^w\varphi(p^w)=(p-1)\sum_{w=0}^c p^{2w-1}\)
  • 那么 \(g(p^{c+1})=g(p^c)+p^{2c+1}\times (p-1)\)
  • \(i=a\times p^c,c>0,a\perp p\) ,那么 \(g(i\times p)=g(a)\times g(p^{c+1}),g(i)=g(a)\times g(p^c)\)
  • \(g(i\times p)-g(i)=g(a)\times p^{2c+1}\times (p-1)\)
  • 同理有 \(g(i)-g(i/p)=g(a)\times p^{2c-1}\times (p-1)\)
  • 那么 \(g(i\times p)=g(i)+(g(i)-g(i/p))\times p^2\)

参考:

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\times p^c,c>0,a\perp p\)
    3. 那么 \(g(i)=g(a)\times g(p^{c})\)
    4. 那么 \(g(i\times p)=g(a)\times g(p^{c+1})\)
    5. 然后算出 \(g(i\times p)-g(i)\)
    6. 算出 \(g(i)-g(i/p)\)
    7. 两个式子相互推一下,就可以得到 \(g(i\times p)\) 的表示式
  • 欧拉函数有一个性质 \(\varphi(p^k)=p^k-p^{k-1}\) ,质数的表示式是可以变换的,所以这里先求出质数的答案

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

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

P3327 [SDOI2015]约数个数和

  • 首先要知道 \(d(xy)=\sum_{i|x}\sum_{j|y}[\gcd(i,j)=1]\)
  • 先推出这样个式子:\(\sum_d\mu(d)\sum_{k_1=1}^{n/d}\sum_{k_2=1}^{m/d}\lfloor\frac{n}{k_1d}\rfloor\lfloor\frac{m}{k_2d}\rfloor\)
  • 将后面的提出来,就是 \(\sum_{i=1}^n\sum_{j=1}^m\lfloor\frac{n}{i}\rfloor\lfloor\frac{m}{j}\rfloor\)
  • 那么 \(O(n\sqrt n)\) 预处理出 \(f(n)=\sum_{i=1}^n\lfloor\frac{n}{i}\rfloor\)
  • 那么原式子就可以在 \(O(T\sqrt n)\) 做完
posted @ 2022-06-04 10:16  kzos  阅读(50)  评论(0)    收藏  举报