zoukankan      html  css  js  c++  java
  • 莫比乌斯反演专题学习笔记

    莫比乌斯反演专题学习笔记

    本文记录一些和莫反有关的内容的笔记

    可能存在诸多谬误,阅读时请谨慎分析

    若发现文中有谬误,如您愿意,恳请您向我指出,不胜感激!


    为什么要学莫比乌斯反演?

    解决一类与狄利克雷卷积、整除、积性函数有关的问题,通过莫比乌斯反演,往往可以将复杂度优化到可接受的范围内


    积性函数

    对于任意互质整数(a,b)(f(ab)=f(a)f(b))的函数称为积性函数

    对于任意整数(a,b)(f(ab)=f(a)f(b))的函数称为完全积性函数

    常见,重要的积性函数有:

    欧拉函数(varphi(n))
    莫比乌斯函数(mu(n))
    狄利克雷卷积单位元(varepsilon=[n=1])
    不变函数({f{1}}(n)=1)

    狄利克雷卷积

    函数(f,g)的狄利克雷卷积((f*g))定义如下

    [(f*g)(n)=sum_{d|n}f(frac{n}{d})g(d) ]

    狄利克雷卷积的单位元为(varepsilon=[n=1])(把它代入到狄利克雷卷积中,可以发现(f*varepsilon=f)

    莫比乌斯函数

    莫比乌斯函数定义如下:

    [mu(i)=egin{cases}1,& ext{if i = 1}\(-1)^k,& ext{if i=}p_1p_2p_3dots p_k(pin prime)\0,& ext{otherwise}end{cases} ]

    下面证明莫比乌斯函数的狄利克雷卷积逆是不变函数,即

    [mu*{f{1}}=varepsilon ]

    以下过程引自【算法讲堂】【电子科技大学】【ACM】莫比乌斯反演

    证明:设(n)的不同质因子的个数为(k),则有

    [mu*{f{1}}=sum_{d|n}mu(d)=sum_{i=0}^k(-1)^iegin{pmatrix}k\iend{pmatrix} ]

    由二项式定理,有

    [(x+y)^k=sum_{i=0}^kx^iy^{k-i}egin{pmatrix}k\iend{pmatrix} ]

    (x=-1,y=1)代入得

    [0^k=sum_{i=0}^k(-1)^iegin{pmatrix}k\iend{pmatrix} ]

    [mu*{f{1}}=varepsilon ]

    证毕

    由此,我们得到莫比乌斯函数的一个性质(sum_{d|m}mu(d)=[m=1])


    由于莫比乌斯函数具有积性,我们可以用线性筛来求出莫比乌斯函数

    void GetPrime()
    {
    	nop[1]=1,mu[1]=1;
    	for(register int i=2;i<=N;++i)
    	{
    		if(!nop[i])pri[++pcnt]=i,mu[i]=-1; 
    		for(register int j=1;j<=pcnt && i*pri[j]<=N;++j)
    		{
    			nop[i*pri[j]]=1;
    			if(i%pri[j]==0)break;
    			else mu[i*pri[j]]=-mu[i];
    		}
    	}
    }
    

    莫比乌斯反演

    • [g(n)=sum_{d|n}f(d) ightarrow f(n)=sum_{d|n}mu(d)g(frac{n}{d}) ]

    证明:

    [g=f*{f{1}},mu*g=f*{f{1}}*mu=f ]

    证毕


    • [g(n)=sum_{n|d}f(d) ightarrow f(n)=sum_{n|d}mu(frac{d}{n})g(d) ]

    证明略

    整除分块

    整除分块可以以(O(sqrt n))的复杂度计算(sum_{i=1}^nlfloorfrac{n}{i} floor)

    首先我们发现(lfloorfrac{n}{i} floor)至多只有(sqrt{2n})个取值,并且每个取值都是一段连续的“块”

    对于每一块([l,r])(forall iin[l,r])(lfloorfrac{n}{i} floor=lfloorfrac{n}{l} floor)

    并且,(r=n/(n/l))

    我们只需要逐段计算即可

    有时候,我们推出的式子可能还需要乘上一个函数,如(varphi,mu)等,这时候我们只需要先对函数求前缀和,每次计算一段时乘上这一段对应的函数之和即可

    for(int l=1,r;l<=n;l=r+1)
    {
        r=n/(n/l);
        re+=(r-l+1)*(n/l);
    //  re+=(sum[r]-sum[l-1])*(n/l);
    }
    

    参考资料

    【算法讲堂】【电子科技大学】【ACM】莫比乌斯反演https://www.bilibili.com/video/av43470417

  • 相关阅读:
    黄聪:电子商务关键数字优化(线上部分,上)
    黄聪:Wordpress如何在主题模板中调用菜单?
    黄聪:WordPress for SAE在Windows下使用SVN部署代码
    黄聪:Ubuntu下使用低版g++编译器编译TSE
    黄聪:如何使用WordPress 2.9内置文章缩略图功能(Post Thumbnail)
    黄聪:相关词句采集与分析研究
    黄聪:JQuery鼠标放上后链接平滑移动效果WordPress插件
    黄聪:TSE分析及完全注释[6] 倒排索引的建立的程序分析(转)
    黄聪:buffer overflow detected问题解决及gcc4.1安装
    黄聪:VMware安装Ubuntu10.10【图解】转
  • 原文地址:https://www.cnblogs.com/lizbaka/p/10509365.html
Copyright © 2011-2022 走看看