Unverified Commit 3d562ae4 authored by ir1d's avatar ir1d Committed by GitHub
Browse files

Merge pull request #891 from luojiny1/patch-2

补充
parents 04239d15 0b844dc2
Loading
Loading
Loading
Loading
+44 −0
Original line number Diff line number Diff line
@@ -106,6 +106,50 @@ void phi_table(int n, int* phi) {

## 筛法求莫比乌斯函数

#### 线性筛

```cpp
void pre() {
  mu[1] = 1;
  for (int i = 2; i <= 1e7; ++i) {
    if (!v[i]) mu[i] = -1, p[++tot] = i;
    for (int j = 1; j <= tot && i <= 1e7 / p[j]; ++j) {
      v[i * p[j]] = 1;
      if (i % p[j] == 0) {
        mu[i * p[j]] = 0;
        break;
      }
      mu[i * p[j]] = -mu[i];
    }
  }
```

## 筛法求约数个数

## 筛法求约数和

$f_i$表示$i$的约数和
$g_i$表示$i$的最小质因子的$p+p^1+p^2+\dots p^k$

```cpp
void pre() {
  g[1] = f[1] = 1;
  for (int i = 2; i <= n; ++i) {
    if (!v[i]) v[i] = 1, p[++tot] = i, g[i] = i + 1, f[i] = i + 1;
    for (int j = 1; j <= tot && i <= n / p[j]; ++j) {
      v[p[j] * i] = 1;
      if (i % p[j] == 0) {
        g[i * p[j]] = g[i] * p[j] + 1;
        f[i * p[j]] = f[i] / g[i] * g[i * p[j]];
        break;
      } else {
        f[i * p[j]] = f[i] * f[p[j]];
        g[i * p[j]] = 1 + p[j];
      }
    }
  }
  for (int i = 1; i <= n; ++i) f[i] = (f[i - 1] + f[i]) % Mod;
}
```

## 其他线性函数