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

    莫比乌斯反演:

    对于两个数论函数(f)(F):

    (F(n) = sum_{d|n}f(d)Leftrightarrow f(n)=sum_{d|n}mu(d)f(frac{n}{d}))

    其中(mu(n))为莫比乌斯函数,当(n=1)时,(mu(n)=1),当(n=p_1 p_2...p_k)时,(mu(n)=(-1)^k),其他情况(mu(n)=0)(主要是不会用(LaTeX)表示分段函数qwq)

    证明:

    为了解决这个问题,我们引入一个新的运算:狄利克雷卷积

    狄利克雷卷积((*)

    定义:对于数论函数(f,g)((f*g)(n)=sum_{d|n}f(d)g(frac{n}{d}))(后面的括号内的(n)可省略不写,默认为(n))

    作为一个运算,它自然有运算必须有的东西:

    单位元:定义函数(epsilon(n)=[n==1]),其中([n=1])表示当(n=1)时值为1,否则为0。这个函数满足对于任意数论函数(F(n)),有(F=F*epsilon),类似于乘法中的 "1" ,因此称这个函数为单位元。

    交换律:(f*g=g*f),这个其实比较显然,因为(d)(frac{n}{d})总是成对的。

    结合律:对于三个数论函数(f,g,h)((f*g)*h = f*(g*h)),证明留做习题。

    逆元:若两个数论函数(f,g)满足(f*g=epsilon),则(f,g)互为逆元。

    (\)

    那么我们就可以开始证明了。等价符号两边分别用卷积表示:

    首先定义一个常函数(u(n)=1),则左边的等式可以表示为 (F=f*u)

    右边的等式表示为 (f=F*mu)

    然后经过理性分析,我们发现(mu * u = epsilon)(n=1)显然,(n eq 1)时在计算的时候(mu(n)=-1)(mu(n)=1)总会成对被枚举计算从而相互抵消,结果为 (0) ,因此成立。

    在这里我们推出了一个非常重要的结论(敲黑板):

    (mu * u = epsilon Rightarrow sum_{d|n}mu(d)=[n=1])

    好我们把右边的式子代到左边去。

    (F = f * u = F * mu * u = F * (mu * u) = F * epsilon = F)

    OK证完了,是不是特别简单

    那么我们就可以来研究一些实际问题了。

    求以下式子的值:

    (\)
    (sum_{i=1}^{n} sum_{j=1}^{m} [gcd(i,j)==1]),多组询问。
    (\)

    其实这个东西不需要反演也可做,用这个结论就行:(sum_{d|n}mu(d)=[n==1]),我们把(n)换成(gcd(i,j)),代入原式可以得到这个:

    (sum_{i=1}^{n}sum_{j=1}^{m}sum_{d|gcd(i,j)}mu(d))

    但这个式子其实没什么用(甚至增加了复杂度)。

    这个时候,按照网上绝大多数博客的方法,叫做”交换求和顺序“。

    可以得到:

    (sum_{d=1}^{min(n,m)} mu(d)lfloor frac{n}{d} floorlfloor frac{m}{d} floor)

    这个变换过程我想了半年都没有想明白(因为我太菜了。)

    我们可以换个角度理解一下,自行打个表:

    (n=3),(m=4),求(gcd(i,j))

    (n diagdown m) 1 2 3 4
    1 1 1 1 1
    2 1 2 1 2
    3 1 1 3 1

    观察发现,如果我们要按照交换求和顺序前的式子计算,(mu(1))会被计算16次,(mu(2))会被计算3次,(mu(3))会被计算1次。

    So,(mu(1))会被计算(lfloor frac{n}{1} floor imes lfloor frac{m}{1} floor)次,(mu(2))会被计算(lfloor frac{n}{2} floor imes lfloor frac{m}{2} floor)次,(mu(3))会被计算(lfloor frac{n}{3} floor imes lfloor frac{m}{3} floor)次。

    经过不完全归纳,我们得到了一个结论:(mu(d))被计算了(lfloor frac{n}{d} floor imes lfloor frac{m}{d} floor)次,从而我们只要枚举这个(d)就可以得到和变换前式子一样的结果:

    (sum_{d=1}^{min(n,m)} mu(d)lfloor frac{n}{d} floorlfloor frac{m}{d} floor)

    好的我们得到了一个(O(Tn))的算法,但是这并不能够解决本题。

    优化瓶颈在于这个(d)我们会枚举(n)次,但是实际上我们理性分析就可以发现,(lfloor frac{n}{d} floorlfloor frac{m}{d} floor)并不是和d一一对应的,(lfloor frac{n}{d} floor)(lfloor frac{m}{d} floor)分别都只有(sqrt{n})(sqrt{m})种取值,乘积经过画图可知,最多只有(sqrt{n} + sqrt{m})种取值,因此我们将式子简单变形,就可以愉快的预处理了。

    (sum_{d=1}^{min(n,m)} mu(d)sum_{d=1}^{min(n,m)}lfloor frac{n}{d} floorlfloor frac{m}{d} floor)

    前半部分线性筛处理,后半部分用学名”数论分块“的方法预处理前缀和就好啦。总复杂度(O(n + Tsqrt{n}))

    Luogu P2257 YY的GCD

  • 相关阅读:
    var在PHP和JS中的使用
    修改PHP上传文件大小限制的方法
    Linux中tail指令详解
    drupal7 profile2模块获取个人信息
    drupal7 STMP邮件模块配置
    drupal读取mysql的longblob字段
    drupal7 自定义登录&找回密码页面,注意事项
    转 VS Code 快捷键大全,没有更全
    权力关进笼子里
    drupal的权限设置
  • 原文地址:https://www.cnblogs.com/lijilai-oi/p/12200295.html
Copyright © 2011-2022 走看看