莫比乌斯反演

目录
  • 前置知识
    • 小碎骨
    • 引理1
    • 引理2
    • 数论分块
  • 积性函数
    • 定义
    • 性质
    • 举例
  • 狄利克雷(Dirichlet)卷积
    • 性质
    • 与积性函数的关系
  • 莫比乌斯函数
    • 定义
    • 性质
      • 证明
      • 关于单位元 $\varepsilon$
      • 补充结论
    • 线性筛求莫比乌斯函数
  • 莫比乌斯反演
    • 公式
    • 证明
  • 例题
    • [HAOI2011] Problem b
  • 写在最后


前置知识

小碎骨

艾佛森括号 \([P] = \begin{cases} 1 &\text{If P is true}\\ 0 &\text{Otherwise} \end{cases}\)
此处 \(P\) 是一个可真可假的命题。

引理1

\[\forall a,b,c\in \mathbb{Z},\left\lfloor\dfrac{a}{bc}\right\rfloor = \left\lfloor{\dfrac{\left\lfloor\dfrac{a}{b}\right\rfloor}{c}}\right\rfloor \]

证明

\[\dfrac{a}{b} = \left\lfloor{\dfrac{a}{b}}\right\rfloor + r(0\le r < 1) \]

\[\left\lfloor\dfrac{a}{bc}\right\rfloor = \left\lfloor\dfrac{a}{b}\times\dfrac{1}{c}\right\rfloor = \left\lfloor{\dfrac{1}{c}\times\left({\left\lfloor{\dfrac{a}{b}}\right\rfloor}+r \right)}\right\rfloor = \left\lfloor{\dfrac{\left\lfloor\dfrac{a}{b}\right\rfloor}{c} + \dfrac{r}{c}}\right\rfloor = \left\lfloor{\dfrac{\left\lfloor{\dfrac{a}{b}}\right\rfloor}{c}}\right\rfloor \]

引理2

\[\forall n\in N,\left| \left\{ \left\lfloor\dfrac{n}{d}\right\rfloor | d\in N\right\} \right| \le \left\lfloor{2\sqrt{n}}\right\rfloor \]

\(|V|\)表示集合\(V\)的元素个数

证明

\(d\le \left\lfloor\sqrt{n}\right\rfloor\)\(\left\lfloor\dfrac{n}{d}\right\rfloor\)最多有\(\left\lfloor\sqrt{n}\right\rfloor\)种取值。
\(d\ge \left\lfloor\sqrt{n}\right\rfloor\),有\(\left\lfloor\dfrac{n}{d}\right\rfloor \le \left\lfloor\sqrt{n}\right\rfloor\)\(\left\lfloor\dfrac{n}{d}\right\rfloor\)最多有\(\left\lfloor\sqrt{n}\right\rfloor\)种取值。
\(\left\lfloor\dfrac{n}{d}\right\rfloor\)两两不同时取最大值。

数论分块

内容独立了出来,详细内容见 数论分块 - Luckyblock

对于一类含有\(\left\lfloor\dfrac{n}{i}\right\rfloor\)的求和式 (\(n\) 为常数),
由于\(\left\lfloor\dfrac{n}{i}\right\rfloor\)单调不增,故存在多个区间\([l,r]\), 使得\(\left\lfloor\dfrac{n}{i}\right\rfloor = \left\lfloor\dfrac{n}{j}\right\rfloor(i,j\in [l,r])\)

对于任意一个\(i\), 我们需要找到一个最大的\(j\), 满足上式,而\(j=\left\lfloor{\dfrac{n}{\left\lfloor{\dfrac{n}{i}}\right\rfloor}}\right\rfloor\)


积性函数

定义

\(\gcd(x,y) = 1\)\(f(xy)=f(x)f(y)\), 则\(f(n)\)为积性函数。

性质

\(f(x), g(x)\)均为积性函数,则以下函数也为积性函数:

\[\large\begin{aligned} & h(x) = f(x^p)\\ & h(x) = f^p(x)\\ & h(x) = f(x)g(x)\\ & h(x) = \sum_{d\mid x} f(d)g(\dfrac{x}{d}) \end{aligned}\]

举例

  • 单位函数 \(\epsilon(n) = [n = 1]\)
  • 恒等函数 \(\operatorname{id}_{k}(n) = n^k\operatorname{id_{1}(n)}\),通常简记为\(\operatorname{id}(n)\)
  • 常数函数 \(1(n) = 1\)
  • 除数函数 \(\sigma_{k}(n) = \sum\limits_{d\mid n} d^k \sigma_0(n)\),通常简记为\(\operatorname{d}(n)\)\(\tau (n)\)\(\sigma_1(n)\)通常简记为 \(\sigma(n)\)
  • 欧拉函数 \(\varphi(n) = \sum\limits_{i=1}^{n} [\gcd(i,n) = 1]\)
  • 莫比乌斯函数 \(\mu(n) = \begin{cases}1 &n=1\\0 &n\ \text{含有平方因子}\\(-1)^k &k\text{为}\ n\ \text{的本质不同质因子个数} \end{cases}\)

没看懂上面写的什么玩意?
根本不用深究,有个印象继续往下看就好。


狄利克雷(Dirichlet)卷积

定义两个数论函数 \(f,g\) 的狄利克雷卷积为

\[\large(f\ast g) (n) = \sum_{d\mid n} f(d)g(\dfrac{n}{d}) \]

性质

满足 交换律 和 结合律。
\(\varepsilon\)为狄利克雷卷积的单位元,有\((f\ast \varepsilon)(n) = f(n)\)
单位元 \(\varepsilon = \mu \ast 1 \iff \varepsilon (n) = \sum\limits_{d\mid n} \mu (d)\)

与积性函数的关系

定义见上文 积性函数-举例

  • 单位元 \(\varepsilon = \mu \ast 1 \iff \varepsilon (n) = \sum\limits_{d\mid n} \mu (d)\)
  • 约数个数 \(d = 1 \ast 1 \iff d(n) = \sum\limits_{d\mid n} 1\)
  • 除数函数 \(\sigma = d \ast 1 \iff \sigma(n) = \sum\limits_{d \mid n} d\)
  • 欧拉函数 \(\varphi = \mu \ast ID \iff \varphi (n) = \sum\limits_{d\mid n} d \cdot \mu(\dfrac{n}{d})\)

也是没看懂上面写的什么玩意?
不用深究,有个印象继续往下看就好。


莫比乌斯函数

定义

\(\mu\) 为莫比乌斯函数,定义为

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

解释

\(n = \prod\limits_{i=1}^{k} p_{i}^{c_i}\),其中\(p_i\)为质因子,\(c_i\ge 1\)

  1. \(n=1\)时,\(\mu (n) = 1\)
  2. \(n\not ={1}\)时 ,
    • \(\exist i\in [1,k], c_i > 1\) 时,\(\mu (n) = 0\)
      当某质因子出现次数大于\(1\)时,\(\mu (n) = 0\)
    • \(\forall i\in [1,k], c_i = 1\) 时,\(\mu (n) = (-1)^k\)
      当每个质因子只出现一次时,即\(n = \prod\limits_{i=1}^{k}p_i\)\(\{p_i\}\)中元素唯一。
      \(\mu (n) = (-1)^k\),此处\(k\)为质因子的种类数。

性质

莫比乌斯函数是积性函数,且具有以下性质

\[\large \sum_{d\mid n} \mu (d) = [n=1] \]

证明

\(n = \prod\limits_{i=1}^{k}{p_i^{c_i}}, n' = \prod\limits_{i=1}^{k}{p_i}\)

  • 根据莫比乌斯函数定义,则有:\(\sum\limits_{d\mid n}{\mu(d)} = \sum\limits_{d\mid n'}{\mu(d)}\)
  • \(n'\)的某因子 \(d\),有\(\mu (d) = (-1)^i\),则它由 \(i\) 个 本质不同的质因子组成。
    由于质因子总数为 \(k\),满足上式的因子数为 \(C_{k}^{i}\)
  • 对于原求和式,转为枚举\(\mu(d)\)的值。
    \(\sum\limits_{d\mid n'}{\mu(d)} = \sum\limits_{i=0}^{k}{C_{k}^{i} \times (-1)^i} = \sum\limits_{i=0}^{k}{C_{k}^{i} \times (-1)^i\times 1^{k-i}}\)
    根据二项式定理,上式 \(= (1+(-1))^k\)
    易知该式在\(k=0\)\(n=0\) 时为\(1\),否则为 \(0\)

关于单位元 \(\varepsilon\)

在上文中定义了 \(\varepsilon (n)= (\mu \ast 1)(n)= \sum\limits_{d\mid n}\mu(d) = [n=1]\)
满足\((f\ast \varepsilon)(n) = f(n)\)

证明

\[\begin{aligned} &(f\ast \varepsilon)(n)\\ = &\sum_{d\mid n} f(d)\varepsilon(\dfrac{n}{d})\\ = &\sum_{d\mid n} f(d)[\dfrac{n}{d} = 1]\\ \end{aligned}\]

  • 对于\([\dfrac{n}{d} = 1]\),当且仅当 \(\dfrac{n}{d}=1\),即 \(d=n\) 时为 \(1\),否则为\(0\)
  • 则当 \(d=n\) 时,\(f(d)[\dfrac{n}{d}=1] = f(n)\)
    \(d\not ={n}\) 时,\(f(d)[\dfrac{n}{d}=1] = 0\)

综上,\((f\ast \varepsilon)(n) = \sum_{d\mid n} f(d)[\dfrac{n}{d} = 1] = f(n)\)

补充结论

反演结论: \([\gcd(i,j) = 1] \iff \sum\limits_{d\mid \gcd(i,j)} {\mu (d)}\)

证明1
\(n = \gcd(i,j)\),则右\(= \sum\limits_{d\mid n} {\mu (d)} = [n = 1] = [\gcd(i,j) = 1]=\) 左。

证明2
暴力展开:\([\gcd(i,j) = 1] = \varepsilon(\gcd(i,j)) = \sum\limits_{d\mid \gcd(i,j)}\mu(d)\)

线性筛求莫比乌斯函数

\(\mu\) 为积性函数,因此可以线性筛莫比乌斯函数。

int cnt, Mobius[MARX], Prime[MARX];
bool vis[MARX];

void GetMobius()
{
    Mobius[1] = 1;
    for(int i = 2; i <= N; i ++)
    {
      if(! vis[i]) Mobius[i] = - 1, Prime[++ cnt] = i;
      for(int j = 1; j <= cnt && i * Prime[j] <= N; j ++)
      {
        vis[i * Prime[j]] = true;
        if(i % Prime[j] == 0) break;
        Mobius[i * Prime[j]] = - Mobius[i];
      }
    }
}

莫比乌斯反演

公式

\(f(n),g(n)\)为两个数论函数。
如果有

\[\large f(n) = \sum\limits_{d\mid n}{g(d)} \]

那么有

\[\large g(n) = \sum\limits_{d\mid n} {\mu(d)f(\dfrac{n}{d})} \]

证明

方法一 :运用卷积。

原问题为:已知 \(f = g\ast 1\),证明 \(g = f\ast \mu\)
易知如下转化:\(f\ast \mu = g\ast 1 \ast \mu \Rightarrow f\ast \mu = g\ast \varepsilon = g\)

方法二:对原式进行数论变换。

  1. \(\sum\limits_{d\mid n}g(d)\) 替换\(f(\dfrac{n}{d})\)

    \[\sum_{d\mid n}{\mu(d)\sum_{k\mid \frac{n}{d}}g(k)} \]

  2. 变换求和顺序。

    \[\sum_{k\mid n}g(k)\sum_{d\mid \frac{n}{k}}{\mu(d)} \]

  3. 依据 \(\sum\limits_{d\mid n}{\mu(d)} = [n=1]\),仅当 \(\dfrac{n}{k} = 1\) 时,\(\sum\limits_{d\mid \frac{n}{k}}{\mu(d)} = 1\),否则为 \(0\)
    此时\(k=n\),故上式等价于 \(\sum\limits_{k\mid n} {[n=k]\cdot g(k)} = g(n)\)

例题

[HAOI2011] Problem b

\(n\) 组询问,每次给定 \(a,b,c,d,k\),求 \(\sum\limits_{x=a}^{b}\sum\limits_{y=c}^{d}[\gcd(x,y) = k]\)
\(1\le n,k,a,b,c,d\le 5e4\)\(a\le b,c\le d\)

\(f(n,m) = \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[\gcd(i,j) = k]\)
根据容斥原理,则原式等价于 \(f(b,d) - f(a-1,d) - f(b,c-1) + f(a-1,c-1)\)
所以问题转化为 如何快速求 \(f\) 的值。

化简 \(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[\gcd(i,j) = k]\)

  • 易知原式等价于

    \[\sum\limits_{i=1}^{\left\lfloor\frac{n}{k}\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\frac{m}{k}\right\rfloor}[\gcd(i,j) = 1] \]

  • \(\varepsilon (n)= \sum\limits_{d\mid n}\mu(d) = [n=1]\),上式化为

    \[\sum\limits_{i=1}^{\left\lfloor\frac{n}{k}\right\rfloor}\sum\limits_{j=1}^{\left\lfloor\frac{m}{k}\right\rfloor}\sum_{d\mid \gcd(i,j)}{\mu(d)} \]

  • 变换求和顺序,先枚举\(d\mid \gcd(i,j)\),可得

    \[\sum_{d=1}\mu(d)\sum_{i=1}^{\left\lfloor\frac{n}{k}\right\rfloor}[d\mid i]\sum_{j=1}^{\left\lfloor\frac{m}{k}\right\rfloor}[d\mid j] \]

    对于上式后半的解释:当\(d\mid i\)\(d\mid j\) 时,\(d\mid \gcd(i,j)\)

  • 易知\(1\sim \left\lfloor\dfrac{n}{k}\right\rfloor\)\(d\) 的倍数有 \(\left\lfloor\dfrac{n}{kd}\right\rfloor\) 个,故原式化为

    \[\sum_{d=1}\mu(d)\left\lfloor\dfrac{n}{kd}\right\rfloor\left\lfloor\dfrac{m}{kd}\right\rfloor \]

预处理 \(\mu\) 后,显然可以数论分块求解,复杂度\(O(N + T\sqrt{n})\)

//By:Luckyblock
#include 
#include 
#include 
#define ll long long
const int MARX = 6e4 + 10;
//=============================================================
int N, a, b, c, d, k;
int cnt, Mobius[MARX], Prime[MARX], Sum[MARX];
bool vis[MARX];
//=============================================================
inline int read()
{
    int f = 1, w = 0; char ch = getchar();
    for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
    for(; isdigit(ch); ch = getchar()) w = (w << 3) + (w << 1) + (ch ^ '0');
    return f * w;
}
void GetMobius()
{
    Mobius[1] = 1;
    int MAX = MARX - 10;
    for(int i = 2; i <= MAX; i ++)
    {
      if(! vis[i]) Mobius[i] = - 1, Prime[++ cnt] = i;
      for(int j = 1; j <= cnt && i * Prime[j] <= MAX; j ++)
      {
        vis[i * Prime[j]] = true;
        if(i % Prime[j] == 0) break;
        Mobius[i * Prime[j]] = - Mobius[i];
      }
    }
    for(int i = 1; i <= MAX; i ++) Sum[i] = Sum[i - 1] + Mobius[i];
}
ll Calc(int x, int y)
{
    ll ans = 0ll; int max = std :: min(x, y);
    for(int l = 1, r; l <= max; l = r + 1)
      r = std :: min(x / (x / l), y / (y / l)),
      ans += (1ll * x / (1ll * l * k)) * (1ll * y / (1ll * l * k)) * (Sum[r] - Sum[l - 1]);
    return ans;
}
ll Solve()
{
    a = read(), b = read(), c = read(), d = read(), k = read();
    return Calc(b, d) - Calc(b, c - 1) - Calc(a - 1, d) + Calc(a - 1, c - 1);
}
//=============================================================
int main()
{ 
    N = read(); GetMobius();
    while(N --) printf("%lld\n", Solve());
    return 0;
}

写在最后

参考资料
\(\text{Oi-Wiki-莫比乌斯反演}\)

\(\text{Oi-Wiki}\)上的内容进行了复制 整理扩充。
我是个没有感情的复读机(大雾)

你可能感兴趣的:(莫比乌斯反演)