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})

  • 相关阅读:
    课后作业-阅读任务-阅读笔记-4
    团队编程项目作业5-小组评分
    课后作业-阅读任务-阅读提问-3
    20171110-构建之法:现代软件工程-阅读笔记
    团队-中国象棋-开发文档
    结对-贪吃蛇-结对项目总结
    20171129-构建之法:现代软件工程-阅读笔记
    课后作业-阅读任务-阅读提问-4
    软件工程课程总结
    团队-石头剪刀布-项目总结
  • 原文地址:https://www.cnblogs.com/maoyiting/p/14198126.html
Copyright © 2011-2022 走看看