zoukankan      html  css  js  c++  java
  • 莫比乌斯反演 (入门级别) 学习笔记

    这文章好水啊。。。

    公式:

    原始版:

    [g(x)=sum_{d|x}f(x)Leftrightarrow f(x)=sum_{d|x}mu(frac{x}{d})g(d) ]

    推论式:

    [g(x)=sum_{x|d}f(d)Leftrightarrow f(x)=sum_{x|d}mu(frac{d}{x})g(d) ]

    简单应用:

    [sum_{i=1}^{n}sum_{j=1}^{m}[gcd(i,j)=x] ]

    (f(x)=displaystylesum_{i=1}^{n}sum_{j=1}^m[gcd(i,j)=x])(g(x)=displaystylesum_{x|d}f(d)).

    根据莫比乌斯反演可得:(f(x)=displaystylesum_{x|d}mu(frac{d}{x})g(d)).

    (g(x)=displaystylesum_{i=1}^nsum_{j=1}^m[x|gcd(i,j)])

    (=displaystylesum_{i=1}^{lfloorfrac{n}{x} floor}sum_{j=1}^{lfloorfrac{m}{x} floor}[1|gcd(i,j)])

    (={lfloorfrac{n}{x} floor} imes {lfloorfrac{m}{x} floor})

    所以(f(x)=displaystylesum_{i=1}^{lfloorfrac{min(n,m)}{x} floor}mu(i)g(icdot x)=displaystylesum_{i=1}^{lfloorfrac{min(n,m)}{x} floor}mu(i) imes {lfloorfrac{n}{ix} floor} imes {lfloorfrac{m}{ix} floor})

    引理1:({lfloorfrac{n}{ab} floor}={lfloorfrac{lfloorfrac{n}{a} floor}{b} floor}).

    引理2:设集合(S={{lfloorfrac{n}{x} floor}|1leq xleq n,xin mathbb{N}}),则(|S|=O(sqrt{n})).

    证明都略了

    (f(x)=displaystylesum_{i=1}^{lfloorfrac{min(n,m)}{x} floor}mu(i) imes {lfloorfrac{lfloorfrac{n}{x} floor}{i} floor} imes {lfloorfrac{lfloorfrac{m}{x} floor}{i} floor})

    预处理出(mu(i))的前缀和即可(O(sqrt{n}))回答每次询问。总复杂度(O(n+sqrt{n})).

    例题1:YY的GCD

    求:

    [sum_{i=1}^{n}sum_{j=1}^{m}[gcd(i,j)in prime] ]

    多组测试数据,(1leq n,mleq 10^7,1leq Tleq 10^4).


    ( ext{原式}=displaystylesum_{i=1}^{n}sum_{j=1}^{m}sum_{pin prime}[gcd(i,j)=p])

    (=displaystylesum_{pin prime}sum_{i=1}^{n}sum_{j=1}^{m}[gcd(i,j)=p])

    (=displaystylesum_{pin prime}sum_{i=1}^{lfloorfrac{n}{p} floor}sum_{j=1}^{lfloorfrac{m}{p} floor}[gcd(i,j)=1])

    (f(n,m,x)=displaystylesum_{i=1}^{n}sum_{j=1}^{m}[gcd(i,j)=x]).

    (g(n,m,x)=displaystylesum_{x|d}f(n,m,d)).

    (g(n,m,x)=displaystylesum_{i=1}^{n}sum_{j=1}^{m}[x|gcd(i,j)])

    (=displaystylesum_{i=1}^{lfloorfrac{n}{x} floor}sum_{j=1}^{lfloorfrac{m}{x} floor}[1|gcd(i,j)])

    显然对于任意(i,jinmathbb{N_+})([1|gcd(i,j)])成立,所以(g(n,m,x)={lfloorfrac{n}{x} floor}{lfloorfrac{m}{x} floor}).

    所以(f(n,m,x)=displaystylesum_{x|d}mu(frac{d}{x})g(n,m,d))

    则我们要求的是(displaystylesum_{pin prime}f(lfloorfrac{n}{p} floor,lfloorfrac{m}{p} floor,1))

    (=displaystylesum_{pin prime}sum_{d=1}^{n}mu(d)lfloorfrac{n}{dp} floorlfloorfrac{m}{dp} floor)

    这个(dp)比较丑,我们把它换成(i),得到

    (displaystylesum_{i=1}^{n}lfloorfrac{n}{i} floorlfloorfrac{m}{i} floorsum_{pin prime,p|i}mu(frac{i}{p})).

    后面(displaystylesum_{pin prime,p|i}mu(frac{i}{p}))我们是可以提前预处理出来的,这样用整除分块就可以(O(sqrt{n}))回答每次询问了。

    参考代码

    例题2:[SDOI2015]约数个数和

    定义(d(x))(x)的约数个数。

    求:

    [sum_{i=1}^{n}sum_{j=1}^{m}d(ij) ]

    多组测试数据,(1leq n,m,Tleq 5 imes 10^4).


    初步转化:

    [d(ij)=sum_{x|i}sum_{y|j}[gcd(x,y)=1] ]

    证明:设(ij=displaystyleprod_{t} p_t^{e_t}),对于任意一个(p_t),设(i)(e_t)的贡献为(a)(j)(e_t)的贡献为(b),即(a+b=e_t)。对于一个(ij)的一个约数(w):如果(w)(p_t)的次数(cleq a),我们在(i)里计算它;否则,我们在(j)里计算(c-a)。即:(x)里一个(p^c)表示当前(ij)的这个因数里有(p^c)(y)里一个(p^c)表示当前(ij)的这个因数里有(p^{c+a})。这样只要(x,y)互质,就保证了不重不漏的计数。

    接下来我们就可以快乐地推式子了。

    原式(=displaystylesum_{i=1}^{n}sum_{j=1}^{m}sum_{x|i}sum_{y|j}[gcd(x,y)=1])

    交换和式:

    (=displaystylesum_{x=1}^{n}sum_{y=1}^{m}sum_{i=1}^{lfloorfrac{n}{x} floor}sum_{j=1}^{lfloorfrac{n}{y} floor}[gcd(x,y)=1])

    (=displaystylesum_{x=1}^{n}sum_{y=1}^{m}{lfloorfrac{n}{x} floor}{lfloorfrac{n}{y} floor}[gcd(x,y)=1])

    开始反演。(把(x,y)换成(i,j)使式子更好看一点)

    (g(x)=displaystylesum_{x|d}f(d))

    (=displaystylesum_{i=1}^{n}sum_{j=1}^{m}lfloorfrac{n}{i} floorlfloorfrac{m}{j} floor[x|gcd(i,j)])

    (=displaystylesum_{i=1}^{lfloorfrac{n}{x} floor}sum_{j=1}^{lfloorfrac{m}{x} floor}lfloorfrac{n}{xi} floorlfloorfrac{m}{xi} floor)

    代回去:(f(x)=displaystylesum_{x|d}mu(frac{d}{x})g(d))

    我们要求的其实是:(f(1)=displaystylesum_{i=1}^{n}mu(i)g(i)).

    我们在(O(nsqrt{n}))的时间内,枚举每个(x)并预处理出(s(x)=displaystylesum_{i=1}^{x}lfloorfrac{x}{i} floor)的值。

    则答案就是(f(1)=displaystylesum_{i=1}^{n}mu(i)s(lfloorfrac{n}{i} floor)s(lfloorfrac{m}{i} floor)),预处理出(mu)的前缀和即可用整除分块(O(sqrt{n}))回答询问。

    参考代码

    例题3:bzoj2693 jzptab

    求:

    [sum_{i=1}^{n}sum_{j=1}^{m}operatorname{lcm}(i,j) ]

    多组测试数据,(1leq n,mleq 10^7,1leq Tleq 10^4).


    这题有个弱化版,没有多测。我们从这里讲起。

    原式(=displaystylesum_{i=1}^{n}sum_{j=1}^{m}frac{ij}{gcd(i,j)})

    (=displaystylesum_{i=1}^{n}sum_{j=1}^{m}sum_{k=1}^{min(n,m)}frac{ij}{k}[gcd(i,j)=k])

    (=displaystylesum_{k=1}^{min(n,m)}sum_{i=1}^{lfloorfrac{n}{k} floor}sum_{j=1}^{lfloorfrac{m}{k} floor}ijk[gcd(i,j)=1])

    (=displaystylesum_{k=1}^{min(n,m)}ksum_{i=1}^{lfloorfrac{n}{k} floor}sum_{j=1}^{lfloorfrac{m}{k} floor}ij[gcd(i,j)=1])

    套用莫比乌斯反演。

    (f(n,m,x)=displaystylesum_{i=1}^{n}sum_{j=1}^{m}ij[gcd(i,j)=1]).

    (g(n,m,x)=displaystylesum_{x|d}f(n,m,d)).

    (g(n,m,x)=displaystylesum_{i=1}^{n}sum_{j=1}^{m}ij[x|gcd(i,j)])

    (=x^2displaystylesum_{i=1}^{lfloorfrac{n}{x} floor}sum_{j=1}^{lfloorfrac{m}{x} floor}ij[1|gcd(i,j)])

    (=x^2displaystylesum_{i=1}^{lfloorfrac{n}{x} floor}sum_{j=1}^{lfloorfrac{m}{x} floor}ij)

    (i)提到前面,得到:

    (=x^2displaystylesum_{i=1}^{lfloorfrac{n}{x} floor}isum_{j=1}^{lfloorfrac{m}{x} floor}j)

    等差数列求和:

    (=x^2displaystylesum_{i=1}^{lfloorfrac{n}{x} floor}ifrac{{lfloorfrac{m}{x} floor} imes ({lfloorfrac{m}{x} floor}+1)}{2})

    (=x^2frac{{lfloorfrac{n}{x} floor} imes ({lfloorfrac{n}{x} floor}+1)}{2}cdotfrac{{lfloorfrac{m}{x} floor} imes ({lfloorfrac{m}{x} floor}+1)}{2})

    代回去得到:

    (f(n,m,x)=displaystylesum_{x|d}mu(frac{d}{x})g(n,m,d))

    (f(lfloorfrac{n}{k} floor,lfloorfrac{m}{k} floor,1)=displaystylesum_{i=1}^{lfloorfrac{n}{k} floor}mu(i)cdot i^2cdot frac{{lfloorfrac{n}{ki} floor} imes ({lfloorfrac{n}{ki} floor}+1)}{2}cdotfrac{{lfloorfrac{m}{ki} floor} imes ({lfloorfrac{m}{ki} floor}+1)}{2})

    于是我们就可以(O(sqrt{n}))计算(f(n,m,k)).

    所以,原式(=displaystylesum_{k=1}^{n}k imes f(lfloorfrac{n}{k} floor,lfloorfrac{m}{k} floor,1)),就可以在(O(sqrt{n}) imes O(sqrt{n})=O(n))的时间内算出了。

    参考代码


    然后来看bzoj这个题。因为要多测,我们(O(n))的复杂度不够优秀。

    为了方便,我们设(S(i,j)=sum_{i=1}^{n}sum_{j=1}^{m}ij).

    则原式(=displaystylesum_{k=1}^{n}ksum_{i=1}^{lfloorfrac{n}{k} floor}mu(i)cdot i^2cdot S(lfloorfrac{n}{ki} floor,lfloorfrac{m}{ki} floor)).

    (T=ki),把(S(lfloorfrac{n}{ki} floor,lfloorfrac{m}{ki} floor))提前,可得:

    (displaystylesum_{T=1}^{n}S(lfloorfrac{n}{T} floor,lfloorfrac{m}{T} floor)sum_{i|T}mu(i)cdot i^2cdotfrac{T}{i})

    (=displaystylesum_{T=1}^{n}S(lfloorfrac{n}{T} floor,lfloorfrac{m}{T} floor)sum_{i|T}mu(i)cdot icdot T)

    后面的部分(f(T)=displaystylesum_{i|T}mu(i)cdot icdot T)显然是一个积性函数,所以我们考虑用线性筛将它预处理出来。

    • (n=1)时,显然有(f(n)=1)

    • (n)为素数时,显然有(f(n)=n-n^2)

    • (n)为合数时,设(n=icdot p_j)(p_j)是质数)。如果(p_j|i),那么(mu(icdot p_j))一定为(0),也就是说没有新增项。因此(f(icdot p_j))相较于(f(i))而言只是每项中的(T)变了,所以(f(n)=f(i)cdot p_j)

    预处理出(f)的前缀和后我们就可以(O(sqrt{n}))回答每次询问了。

    参考代码

  • 相关阅读:
    爬虫之爬取淘宝主题市场主要产品信息
    Linux内核11-定时器和时间管理
    UNIX8-进程控制
    UNIX7-进程环境
    Unix3-文件I/O接口
    Linux进程-打开的文件
    递归与二叉树_leetcode230
    递归与二叉树_leetcode235
    递归与二叉树_leetcode226
    递归与二叉树_leetcode222
  • 原文地址:https://www.cnblogs.com/dysyn1314/p/12359318.html
Copyright © 2011-2022 走看看