zoukankan      html  css  js  c++  java
  • [复习资料]莫比乌斯反演学习笔记

    由于不想再估了,所以把之前写的 copy 一遍,顺便复习一下。(捂脸)

    整除分块

    考虑这样一个问题,求:

    [sum_{i=1}^{n}lfloorfrac{n}{i} floor ]

    因为题目要求的是向下取整,所以肯定会有一些相同的部分,对于这些相同的部分可以直接一起累加。

    给定一个数(k),满足(lfloorfrac{n}{x} floor=lfloorfrac{n}{k} floor)相同的最大的(x)就是(lfloorfrac{n}{lfloorfrac{n}{k} floor} floor)

    于是代码大概是这样的:

    for(int l=1,r;l<=n;l=r+1){
    	r=n/(n/l);
    	ans+=(r-l+1)*(n/l);
    }
    

    时间复杂度:(O(sqrt{n}))

    时间复杂度的证明:

    (lfloorfrac{n}{a} floor)最多有(2sqrt{n})种取值。当(a<=sqrt{n})时,共有(sqrt{n})取值;当(a>sqrt{n})时,(lfloorfrac{n}{a} floor<sqrt{n}),也是共有(sqrt{n})种取值。每次都是将同一种取值的范围全部取完,所以复杂度就是(O(sqrt{n}))


    数论函数

    在数论上,算术函数(或称数论函数)指定义域为正整数、陪域为复数的函数,每个算术函数都可视为复数的序列。-百度百科

    默认下面讲到的都是数论函数。

    函数的运算:

    [f,h ext{为函数,}k,n ext{为常数} ]

    [(f+h)(n)=f(n)+h(n) ]

    [(kf)(n)=kcdot f(n) ]


    积性函数

    如果对于任意的(gcd(n,m)=1),都满足(f(nm)=f(n)f(m)),我们就称这个函数是积性函数。

    如果即使不满足(gcd(n,m)=1),也有(f(nm)=f(n)f(m)),那么就称这个函数是完全积性函数。

    常见的积性函数:

    [varphi(n) ext{表示小于}n ext{且和}n ext{互质的数的个数} ]

    [d(n) ext{表示}n ext{的因子个数} ]

    [sigma(n) ext{表示}n ext{的所有因子和} ]

    [ ext{莫比乌斯函数:}mu(n)=egin{cases}1\(-1)^k\0end{cases}egin{matrix}(n=1)\(n=p_1p_2dots p_k,pin prime)\(otherwise)end{matrix} ]

    常见的完全积性函数:

    [epsilon(n)=[n==1] ]

    [id(n)=n ]

    [I(n)=1 ]

    积性函数的一个性质:两个积性函数的狄利克雷卷积还是积性函数


    狄利克雷卷积

    数论函数(f(n),g(n))的狄利克雷卷积是一个数论函数,定义为

    [t(n)=sum_{dmid n}f(d)g(frac{n}{d})=sum_{ab=n}f(a)g(b) ]

    简单记为:(t=f*g)

    狄利克雷卷积满足的一些性质:

    1. [ ext{交换律:}f*g=g*f ]

    2. [ ext{结合律:}(f*g)*h=f*(g*h) ]

    3. [ ext{分配律:}f*h+g*h=(f+g)*h ]

    4. [(xf)*g=x(f*g) ]

    5. [epsilon *f=f ]

    6. [ ext{逆元:对于每一个}f(1) e 0 ext{的函数}f ext{都存在函数}g ext{使得}f*g=epsilon ]

    对于性质六,考虑构造一个满足条件的(g)

    由狄利克雷卷积的定义可以得到:

    [sum_{dmid n}f(d)g(frac{n}{d})=f(1)g(n)+sum_{dmid n,d e 1}f(d)g(frac{n}{d})=[n==1] ]

    所以有:

    [g(n)=frac{1}{f(1)}([n==1]-sum_{dmid n,d e 1}f(d)g(frac{n}{d})) ]

    和狄利克雷卷积相关的一些东西:

    [mu * I=epsilon ]

    证明:
    原式就是(sum_{dmid n}mu(d)=[n==1])
    (n=p_1^{k_1}p_2^{k_2}dots p_x^{k_x}(pin prime))
    (d)分解后其中的某个质因子的次数大于1,那么(mu(d)=0),我们只考虑(mu(d) e 0)的情况,相当于要证明:

    [inom{x}{0}-inom{x}{1}+inom{x}{2}-dots+(-1)^xinom{x}{x} ]

    (n=1)时,(x=0),显然有(inom{0}{0}=1)
    (n e 1)时,有:

    [inom{x}{0}+inom{x}{2}+dots=sum_{i=1}^{x-1}inom{x-1}{i} ]

    [inom{x}{1}+inom{x}{3}+dots=sum_{i=1}^{x-1}inom{x-1}{i} ]

    两式相减就是原式,所以原式等于0。

    [varphi * I=id ]

    证明:
    原式就是(sum_{dmid n}varphi(d)=n)
    写出(n)个分数:

    [frac{1}{n},frac{2}{n},frac{3}{n},cdots,frac{n}{n} ]

    化简后,分数(frac{a}{d})存在当且仅当(gcd(a,d)=1,dmid n)
    所以分母为(d)的分数有(varphi(d))个。

    由此我们可以得到(varphi)(mu)的关系:

    [ecause varphi * I =id ]

    [ hereforevarphi * I * mu=id * mu ]

    [ herefore varphi=id*mu ]

    [ ext{即}varphi(n) = sum_{dmid n}frac{n}{d}* mu(d) ]

    [ hereforefrac{varphi(n)}{n}=sum_{dmid n}frac{mu(d)}{d} ]


    杜教筛

    杜教筛可以以低于线性的时间复杂度来计算积性函数的前缀和。

    求:(sum_{i=1}^nf(i))

    我们要构造两个积性函数(h)(g),使得(h=f*g)

    (S(n)=sum_{i=1}^nf(i))

    [sum_{i=1}^nh(i)=sum_{i=1}^nsum_{dmid i}g(d)f(frac{i}{d}) ]

    [ o=sum_{d=1}^ng(d)sum_{i=1}^{lfloorfrac{n}{d} floor}f(i) ]

    [ o=sum_{d=1}^ng(d)S(lfloorfrac{n}{d} floor) ]

    [g(1)S(n)=sum_{i=1}^nh(i)-sum_{d=2}^ng(d)S(lfloorfrac{n}{d} floor) ]

    (S(lfloorfrac{n}{d} floor))可以用整除分块,一般如果(h)的前缀和好求,那么就可以递归较快地求出(S)

    实现可以先筛出前一部分的函数值,然后递归求解答案,一般要用hash或者unordered_map记录(f(n))

    举例:求(sum_{i=1}^nmu(i))

    [mu*I=epsilon ]

    [I(1)S(n)=sum_{i=1}^nepsilon(i)-sum_{d=2}^nI(d)S(lfloorfrac{n}{d} floor)=1-sum_{d=2}^nS(lfloorfrac{n}{d} floor) ]


    莫比乌斯反演

    莫比乌斯反演定理:

    [F(n)=sum_{dmid n}f(d)Leftrightarrow f(n)=sum_{dmid n}mu(frac{n}{d})F(d) ]

    证明如下:

    [ecause F(n)=sum_{dmid n}f(d) ]

    [ hereforesum_{kmid n}mu(frac{n}{k})F(k)=sum_{kmid n}mu(frac{n}{k})sum_{dmid k}f(d)=sum_{dmid n}f(d)sum_{kmid frac{n}{d}}mu(k)=sum_{dmid n}f(d)[n==d]=f(n) ]

    其实还有更简便的证明:

    [ecause F=f*I ]

    [ herefore F*mu=f*I*mu=f ]

    [ ext{即}f(n)=sum_{dmid n}mu(frac{n}{d})F(n) ]

    另一种形式:

    [F(d)=sum_{dmid n}f(n)Leftrightarrow f(d)=sum_{dmid n}mu(frac{n}{d})F(n) ]

    举例:求(sum_{i=1}^nsum_{j=1}^mgcd(i,j))

    [ ext{设}f(x)=sum_{i=1}^nsum_{j=1}^m[gcd(i,j)==x] ]

    [ ext{设}F(x)=sum_{i=1}^nsum_{j=1}^m[xmidgcd(i,j)]=lfloorfrac{n}{x} floorlfloorfrac{m}{x} floor ]

    [ ext{那么有:}F(x)=sum_{xmid d}f(d) ]

    [f(x)=sum_{xmid d}F(d)mu(frac{d}{x})=sum_{xmid d}lfloorfrac{n}{d} floorlfloorfrac{m}{d} floormu(frac{d}{x}) ]

    答案就是:

    [sum_{i=1}^{min(n,m)}icdot f(i)=sum_{i=1}^{min(n,m)}isum_{imid d}lfloorfrac{n}{d} floorlfloorfrac{m}{d} floormu(frac{d}{i}) ]

    [ o=sum_{d=1}^{min(n,m)}lfloorfrac{n}{d} floorlfloorfrac{m}{d} floorsum_{imid d}icdot mu(frac{d}{i}) ]

    [ o=sum_{d=1}^{min(n,m)}lfloorfrac{n}{d} floorlfloorfrac{m}{d} floorvarphi(d) ]

    (varphi(d))可以直接线性筛得到,如果只是单组询问,可以直接(O(n))做,否则把后面部分做个前缀和,然后就可以整除分块做了。

    附整除分块的代码:

    int mx=min(n,m),ans=0;
    for(int l=1,r;l<=mx;l=r+1){
    	r=min(n/(n/l),m/(m/l));
    	ans+=sum[r]-sum[l-1];
    }
    

    模板题:

    1. P1447 [NOI2010]能量采集

    2. P2257 YY的GCD

    不那么模板的题目:

    1. P1829 [国家集训队]Crash的数字表格 / JZPTAB(注:此题并没有用到莫比乌斯反演,而是用到了莫比乌斯函数的一个性质)

    2. P3768 简单的数学题(注:此题要用杜教筛)

    可能可以做的题目:

    1. P3704 [SDOI2017]数字表格

    2. [MtOI2019]幽灵乐团

    3. 一个人的数论

  • 相关阅读:
    mac os programming
    Rejecting Good Engineers?
    Do Undergrads in MIT Struggle to Obtain Good Grades?
    Go to industry?
    LaTex Tricks
    Convert jupyter notebooks to python files
    How to get gradients with respect to the inputs in pytorch
    Uninstall cuda 9.1 and install cuda 8.0
    How to edit codes on the server which runs jupyter notebook using your pc's bwroser
    Leetcode No.94 Binary Tree Inorder Traversal二叉树中序遍历(c++实现)
  • 原文地址:https://www.cnblogs.com/lsq147/p/13715303.html
Copyright © 2011-2022 走看看