卷积与莫比乌斯反演

卷积与莫比乌斯反演

Part 1 卷积

卷积是一种由两个函数生成第三个函数的操作,定义如下:

\[ h(x) = \sum_{d|x} f(d)g(\frac{x}{d} ) = \sum_{ab = x} f(a)g(a) \]

就是枚举 x 的每对因数,计算 f, g 填入他们的和。

一般记为 \(h = f \ast g\)

卷积满足交换律,结合率,分配律,且 \(f = g\) 的充要条件是 \(f \ast h = g \ast h\) 且 \(h(1) \neq 1\)

Part 1.1 几个常见的积性函数

$ (x) = [x = 1] $ 单位函数 ($ [p] $ 的意思是当 p 为 true 时等式为 0 ,否则为 0)

$ I(x) = 1 $ 常数函数

$ (x) $ 莫比乌斯函数

$ (x) $ 欧拉函数

有以下结论:

\[ \begin{matrix} \epsilon = 1 \ast \mu\\1 = \epsilon \ast 1 \end{matrix} \]

Part 2 莫比乌斯反演

定义:若 \[ g(n) = \sum_{d \mid n} f(d) \] 则有 \[ f(n) = \sum_{d \mid n} g(d) \mu(\frac{n}{d}) \]

其实可以理解成 \[ g = f \ast 1 \leftrightarrow f = g \ast \mu \]

很多时候,可以用到这个推论 \[ \mu \ast 1 = \epsilon \] 即 \[ \sum_{d \mid n} \mu(d) = \epsilon(n) = [n = 1] \]

如果我们能够转化式子,我们就能用下面的方式线性预处理莫比乌斯以及其它积性函数。(线性筛)

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];
    }
  }
}

如果没看懂,没关系,推一道题就行了。



动态规划进阶

动态规划是一种常用的方法,通过记录“状态”将原问题划分为多个子问题从而使原问题得到解决。