zoukankan      html  css  js  c++  java
  • 「算法笔记」莫比乌斯反演

    一、积性函数

    数论函数是指一个正整数到整数的映射。

    积性函数:对于所有 互质 的整数 (a,b),有性质 (f(ab)=f(a)f(b)) 的数论函数。常见的积性函数有:

    • 约数个数函数  (d(n)=sum_{dmid n} 1)
    • 约数和函数  (sigma (n)=sum_{dmid n} d)
    • 约数 (k) 次幂函数  (sigma_k (n)=sum_{dmid n} d^k)
    • 欧拉函数  (varphi (n)=sum_{i=1}^n [gcd(i,n)=1])
    • 莫比乌斯函数  (mu (n)=egin{cases}1&{n=1}\(-1)^k&c_{1,2,...,k}=1 (n=prod_{i=1}^k p_i^{c_i})\0&c_i>1end{cases})

    完全积性函数:对于所有整数 (a,b),有性质 (f(ab)=f(a)f(b)) 的数论函数。

    如常数函数 (1),幂函数 ( ext{Id}_k(n)=n^k)(特别地,( ext{Id}_1(n)) 通常记作 ( ext{Id}(n))),单位函数 (varepsilon(n)=[n=1])

    二、狄利克雷卷积

    1. 定义与性质

    定义:对于两个数列函数 (f,g),定义它们的 狄利克雷卷积 (h=f*g)

    (displaystyle h(x)=sum_{amid x}f(a)gleft(frac{x}{a} ight))

    性质:狄利克雷卷积满足交换律、结合律、对加法的分配律,有单位元  (varepsilon)

    • 交换律:(f*g=g*f)

    • 结合律:((f*g)*h=f*(g*h))

    • 分配律:(f*(g+h)=f*g+f*h)

    • 单位元:(f*varepsilon=f)。(其中 (varepsilon) 为单位函数 (varepsilon(x)=[x=1])

    (f,g) 是积性函数,则 (f*g) 也是积性函数。

    2. 常用卷积

    (varepsilon=mu*1 Leftrightarrowvarepsilon(n)=sum_{dmid n}mu(d))     (d=1*1 Leftrightarrow d(n)=sum_{dmid n}1)

    (sigma= ext{Id}*1 Leftrightarrow sigma(n)=sum_{dmid n}d)     (sigma_k= ext{Id}_k*1 Leftrightarrow sigma_k(n)=sum_{d|n} d^k)

    (varphi=mu* ext{Id}Leftrightarrowvarphi(n)=sum_{dmid n}dcdotmu(frac{n}{d})Leftrightarrow ext{Id}=varphi*1Leftrightarrow ext{Id}(n)=sum_{dmid n}varphi(d))

    三、莫比乌斯函数

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

    (mu (n)=egin{cases}1&{n=1}\(-1)^k&c_{1,2,...,k}=1 (n=prod_{i=1}^k p_i^{c_i})\0&c_i>1end{cases})

    性质:莫比乌斯函数是一个积性函数。

    (sum_{dmid n}mu (d)=egin{cases}1&{n=1}\0&n eq 1end{cases}),即 (sum_{dmid n}mu(d)=varepsilon(n)),也就是 (mu*1=varepsilon)

    • 证明:设 (n=prod_{i=1}^k {p_i}^{c_i},n'=prod_{i=1}^k p_i),那么 (sum_{dmid n}mu(d)=sum_{dmid n'}mu(d)=sum_{i=0}^k C_k^icdot(-1)^i=(1-1)^k=[n=1])

    在狄利克雷卷积的意义下,(mu*1=varepsilon),即 (mu)(1) 互为逆元。

    线性筛求莫比乌斯函数

    //线性筛求莫比乌斯函数 
    vis[0]=vis[1]=1,u[1]=1;
    for(int i=2;i<=n;i++){
        if(!vis[i]) p[++cnt]=i,u[i]=-1;
        for(int j=1;j<=cnt&&i*p[j]<=n;j++){
            vis[i*p[j]]=1;
            if(i%p[j]==0){u[i*p[j]]=0;break;} 
            u[i*p[j]]=-u[i]; 
        }
    }

    四、莫比乌斯反演

    公式:(f(n),g(n)) 为两个数论函数。

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

    证明:其实就是,若 (f=g*1),则 (g=mu*f)。两边同时卷 (mu) 即得。

    具体地,(f*mu=g*1*muRightarrow f*g=g)(其中 (1*mu=varepsilon))。

    补充:

    • (f(n)=sum_{dmid n}g(d)Leftrightarrow g(n)=sum_{dmid n}mu(d)f(frac{n}{d}))

    • (f(n)=sum_{nmid d}g(d)Leftrightarrow g(n)=sum_{nmid d}mu(frac{d}{n})f(d))

    五、一些应用

    可参考 莫比乌斯反演 - OI Wiki

    求解内容问题形式题目
    (sum_{i=1}^nsum_{j=1}^m[gcd(i,j)=k]) (gcd) 定值统计 「HAOI 2011」Problem B
    (sum_{i=1}^n ext{lcm}(i,n)) 非对称 ( ext{lcm}) 「SPOJ 5971」LCM Sum
    (sum_{i=1}^nsum_{j=1}^m ext{lcm}(i,j)) 对称 ( ext{lcm}) 「BZOJ 2154」Crash 的数字表格
    (sum_{i=1}^nsum_{j=1}^m icdot jcdot gcd(i,j)) 带系数的 (gcd) 统计 「Luogu 3768」简单的数学题
    (sum_{i=1}^nsum_{j=1}^m d(icdot j)) 约数个数统计 「SDOI2015」约数个数和

    「SDOI2015」约数个数和 要用到的一个式子:(d(icdot j)=sum_{xmid i}sum_{ymid j}[gcd(x,y)=1])

    六、套路总结

    关于莫比乌斯反演:

    • 对于布尔类型的求和可以考虑用 (varepsilon(n)=[n=1]) 替换,再通过 (sum_{dmid n}mu(d)=varepsilon(n)) 来变形。

    • 已知 (f(x)),可以考虑设一个 (g(x)=sum_{xmid d}f(d)),化简 (g(x)) 后,根据莫比乌斯反演,(f(x)=sum_{xmid d}mu(frac{d}{x})g(d)),再将 (g) 代入 (f)

    • 灵活变换枚举条件。含有向下取整的式子可以变换枚举顺序提到前面,方便 整除分块

    关于推式子:

    • 常见的 (gcd) 化法:

      • 1. 例如把 (sum_{i=1}^nsum_{j=1}^m [gcd(i,j)=k]) 化简为 (sum_{i=1}^{lfloor frac{n}{k} floor}sum_{j=1}^{lfloor frac{m}{k} floor} [gcd(i,j)=1])

      • 2. 例如把 (sum_{i=1}^nsum_{j=1}^msum_{dmid i,dmid j,gcd(frac{i}{d},frac{j}{d})=1}frac{icdot j}{d}) 换成 (sum_{d=1}^n dcdot sum_{i=1}^{lfloor frac{n}{d} floor}sum_{j=1}^{lfloor frac{m}{d} floor}[gcd(i,j)=1]cdot icdot j)

    • 常见的约数化法:对于 (dmid x),可以考虑枚举 (d)(frac{x}{d}),改变求和顺序。对于出现了 (frac{n}{d}) 的情况,有时可以考虑设 (d'=frac{n}{d}) 进行变换。

      • 1. 比如把 (sum_{i=1}^nsum_{j=1}^msum_{xmid i}sum_{ymid j} [gcd(x,y)=1]) 变成 (sum_{x=1}^nsum_{y=1}^m lfloorfrac{n}{x} floor lfloorfrac{m}{y} floor [gcd(x,y)=1])

      • 2. 比如把 (sum_{d=1}^nsum_{dmid i}^nsum_{dmid j}^mmu(d)cdot icdot j) 变为 (sum_{d=1}^nmu(d)cdot d^2cdot sum_{i=1}^{lfloor frac{n}{d} floor}sum_{j=1}^{lfloor frac{m}{d} floor}icdot j)

      • 3. 设 (d'=frac{n}{d})。比如把 (sum_{dmid n}frac{n^2cdotvarphi( frac{n}{d})}{d}) 变成 (ncdotsum_{d'mid n}d'cdot varphi(d'))

    • 有时可以将式子转化成常见的积性函数。一个简单的例子:把 (sum_{i=1}^x [gcd(i,x)=1]) 转化为 (varphi(x))

    • 对于直接贡献的可以考虑变换枚举顺序使之变成系数。比如把 (sum_{i=1}^x [dmid i]) 变为 (frac{x}{d})(sum_{i=1}^nsum_{j=1}^m icdot j) 变成 (frac{n(n+1)}{2} imes frac{m(m+1)}{2})

  • 相关阅读:
    84. Largest Rectangle in Histogram (Solution 2)
    84. Largest Rectangle in Histogram (Solution 1)
    73. Set Matrix Zeroes
    【JavaScript】Symbol 静态方法
    【JavaScript】Date
    【JavaScript】Math
    725. Split Linked List in Parts把链表分成长度不超过1的若干部分
    791. Custom Sort String字符串保持字母一样,位置可以变
    508. Most Frequent Subtree Sum 最频繁的子树和
    762. Prime Number of Set Bits in Binary Representation二进制中有质数个1的数量
  • 原文地址:https://www.cnblogs.com/maoyiting/p/14198126.html
Copyright © 2011-2022 走看看