zoukankan      html  css  js  c++  java
  • 莫比乌斯反演技巧

    莫比乌斯技巧解析

    前言

    本篇博客主要通过例题介绍一些莫比乌斯反演的技巧,内容参考自莫比乌斯反演-让我们从基础开始(强烈推荐),本片博客力求在其基础上更加清晰的解释其中的一些难以理解的地方

    在阅读之前,你应该要先学会

    • 各种筛法(线性筛,杜教筛,min_25筛等)
    • 狄利克雷卷积
    • 莫比乌斯反演
    • 数论分块

    狄利克雷卷积

    (f ast g=t)

    (t(n)=sumlimits_{dmid n}f(d)g(frac{n}{d}))

    莫比乌斯反演

    (sumlimits_{dmid n}mu(d)=[n=1]=varepsilon(n)),即 (mu ast 1=varepsilon)

    数论分块

    for(int l=1,r; l<=n; l=r+1) {
    	r=n/(n/l);
        
    }
    
    for(int l=1,r; l<=min(n,m); l=r+1) {
    	r=min(n/(n/l),m/(m/l));
        
    }
    

    约定

    下文中,默认 (nleq m)

    基础例题

    问题

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

    解析

    这道题不符合莫比乌斯反演的基本形式,但我们仍然可以转化

    我们枚举 (k) 的值,得到

    [=sumlimits_{k=1}^{n}sumlimits_{i=1}^{n}sumlimits_{j=1}^{m}[gcd(i,j)=k] imes k ]

    同时除以 (k) 得到

    [=sumlimits_{k=1}^{n}sumlimits_{i=1}^{lfloorfrac{n}{k} floor}sumlimits_{j=1}^{lfloorfrac{m}{k} floor}[gcd(i,j)=1] imes k ]

    这样相当于将 (i)(j) 同时除以 (k) ,原本 (gcd(i,j)=k) 的数如今就 (=1)

    然后按照莫比乌斯反演的公式

    [=sumlimits_{k=1}^{n}sumlimits_{i=1}^{lfloorfrac{n}{k} floor}sumlimits_{j=1}^{lfloorfrac{m}{k} floor}sumlimits_{dmid gcd(i,j)}mu(d) imes k ]

    接下来,我们改变枚举的思路,枚举 (d) ,得到

    [=sumlimits_{k=1}^{n}sumlimits_{d=1}^{lfloorfrac{n}{k} floor}mu(d)ksumlimits_{i=1}^{lfloorfrac{n}{k} floor}[dmid i]sumlimits_{j=1}^{lfloorfrac{m}{k} floor}[dmid j] ]

    (sumlimits_{i=1}^{n}[dmid i]) 实际上就是指在 (1)(n)(d) 的倍数,也就是 (lfloorfrac{n}{d} floor)

    因此,原式即为

    [=sumlimits_{k=1}^{n}sumlimits_{d=1}^{lfloorfrac{n}{k} floor}mu(d)klfloorfrac{n}{kd} floorlfloorfrac{m}{kd} floor ]

    注意到前面的 (lfloorfrac{n}{k} floor) 和后面的 (lfloorfrac{n}{kd} floor)(lfloorfrac{m}{kd} floor) 是可以数论分块的,通过两次数论分块,我们可以做到 (O(sqrt{n} imes sqrt{m})approx O(n))

    看上去好像已经无法优化了,然而其实还可以继续优化

    (T=dk),得

    [=sumlimits_{k=1}^{n}sumlimits_{d=1}^{lfloorfrac{n}{k} floor}mu(d)klfloorfrac{n}{T} floorlfloorfrac{m}{T} floor ]

    因为 (T=dk)(k=frac{T}{d})。我们按照枚举 (T) 的顺序得

    [=sumlimits_{T=1}^{n}lfloorfrac{n}{T} floorlfloorfrac{m}{T} floorsumlimits_{dmid T}mu(d)frac{T}{d} ]

    我们发现,后面的式子正好符合狄利克雷卷积的形式

    (varphi=muast id)(varphi(n)=sumlimits_{dmid n}mu(d)frac{T}{d}) 代入得到

    [=sumlimits_{T=1}^{n}lfloorfrac{n}{T} floorlfloorfrac{m}{T} floorvarphi(T) ]

    这样,我们就可以先 (O(n)) 线性筛预处理出 (varphi) 的前缀和,再 (O(sqrt{n})) 数论分块处理即可。

    这样,我们就将原本 (O(n^2)) 的时间复杂度变为了 (O(sqrt{n}))

    另一种解法

    我们知道 (n=sumlimits_{dmid n}varphi(d))

    因此原式即为

    [=sumlimits_{i=1}^{n}sumlimits_{j=1}^{m}sumlimits_{dmid gcd(i,j)}varphi(d) ]

    (d) 提前

    [=sumlimits_{d=1}^{n}varphi(d)sumlimits_{i=1}^{n}[dmid i]sumlimits_{j=1}^{m}[dmid j] ]

    [=sumlimits_{d=1}^{n}varphi(d)lfloorfrac{n}{d} floorlfloorfrac{m}{d} floor ]

    与我们使用莫比乌斯反演推出的式子一样

    总结

    主要有以下几点

    1. (sumlimits_{i=1}^{n}sumlimits_{j=1}^{m}[gcd(i,j)=1]=sumlimits_{i=1}^{n}sumlimits_{j=1}^{m}sumlimits_{dmid n}mu(d)=sumlimits_{d=1}^{n}mu(d)lfloorfrac{n}{d} floorlfloorfrac{m}{d} floor),也就是莫比乌斯反演的基本形式

    2. (sumlimits_{i=1}^{n}sumlimits_{j=1}^{m}[gcd(i,j)=k]=sumlimits_{i=1}^{lfloorfrac{n}{k} floor}sumlimits_{j=1}^{lfloorfrac{m}{k} floor}[gcd(i,j)=1])

      当然如果有的话,要注意 (i,j) 的影响,即(sumlimits_{i=1}^{n}sumlimits_{j=1}^{m}ij[gcd(i,j)=k]=sumlimits_{i=1}^{lfloorfrac{n}{k} floor}sumlimits_{j=1}^{lfloorfrac{m}{k} floor}ij[gcd(i,j)=1] imes k^2)

      因为 (i, j) 同时除以了 (k),因此要把 (i)(j) 缩小 (k) 的乘回来,即乘以 (k^2)

    3. (sumlimits_{i=1}^{n}sumlimits_{j=1}^{m}gcd(i,j)=sumlimits_{k=1}^{n}sumlimits_{i=1}^{n}sumlimits_{j=1}^{m}[gcd(i,j)=k] imes k)

      不仅如此,对于别的限制我们也可以如此操作,例如

      [sumlimits_{i=1}^{n}sumlimits_{j=1}^{m}f[gcd(i,j)]=sumlimits_{k=1}^{n}sumlimits_{i=1}^{n}sumlimits_{j=1}^{m}[gcd(i,j)=k] imes f[k] ]

      又或者是对 (gcd(i,j)) 有限制的,也可以如此

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

    4. 如果需要两次数论分块,可以考虑设 (T=dk),用来枚举两块的乘积,这样后面的那一块就可以埃氏筛、线性筛预处理

    困难题目

    讲完了基础的练习,我们再来看看难一些的题目

    例题1

    问题

    [sumlimits_{i=1}^{n}sumlimits_{j=1}^{i}frac{lcm(i,j)}{gcd(i,j)} ]

    (nle 10^5)(tle 10^5) 组数据)

    解析

    首先,我们知道 (lcm(i,j)=frac{ij}{gcd(i,j)}),因此原式即

    [=sumlimits_{i=1}^{n}sumlimits_{j=1}^{i}frac{ij}{gcd(i,j)^2} ]

    然后我们发现 (sumlimits_{j=1}^{i}) 上面的 (i) 很烦人,因此我们考虑把它弄掉

    让原式整体乘二,可以得到

    [=sumlimits_{i=1}^{n}sumlimits_{j=1}^{n}frac{ij}{gcd(i,j)^2}-n ]

    因此原式即为

    [=frac{sumlimits_{i=1}^{n}sumlimits_{j=1}^{n}frac{ij}{gcd(i,j)^2}-n}{2} ]

    (S=sumlimits_{i=1}^{n}sumlimits_{j=1}^{n}frac{ij}{gcd(i,j)^2})

    按照上面的套路,我们开始化简式子

    [egin{align*} S&=sumlimits_{i=1}^{n}sumlimits_{j=1}^{n}frac{ij}{gcd(i,j)^2}\ &=sumlimits_{k=1}^{n}sumlimits_{i=1}^{n}sumlimits_{j=1}^{n}frac{ij}{k^2}[gcd(i,j)=k]\ &=sumlimits_{k=1}^{n}sumlimits_{i=1}^{lfloorfrac{n}{k} floor}sumlimits_{j=1}^{lfloorfrac{n}{k} floor}frac{ij imes k^2}{k^2}[gcd(i,j)=1]\ &=sumlimits_{k=1}^{n}sumlimits_{i=1}^{lfloorfrac{n}{k} floor}sumlimits_{j=1}^{lfloorfrac{n}{k} floor}ijsumlimits_{dmid n}mu(d)\ &=sumlimits_{k=1}^{n}sumlimits_{d=1}^{lfloorfrac{n}{k} floor}mu(d)sumlimits_{i=1}^{lfloorfrac{n}{k} floor}[dmid i]isumlimits_{j=1}^{lfloorfrac{n}{k} floor}[dmid j]j\ &=sumlimits_{k=1}^{n}sumlimits_{d=1}^{lfloorfrac{n}{k} floor}mu(d)sumlimits_{i=1}^{lfloorfrac{n}{dk} floor}disumlimits_{j=1}^{lfloorfrac{n}{dk} floor}dj\ &设 T=dk\ &=sumlimits_{k=1}^{n}sumlimits_{d=1}^{lfloorfrac{n}{k} floor}mu(d)d^2sumlimits_{i=1}^{lfloorfrac{n}{T} floor}isumlimits_{j=1}^{lfloorfrac{n}{T} floor}j\ &=sumlimits_{T=1}^{n}sumlimits_{i=1}^{lfloorfrac{n}{T} floor}isumlimits_{j=1}^{lfloorfrac{n}{T} floor}jsumlimits_{dmid T}mu(d)d^2end{align*}]

    (sum(T)=sumlimits_{i=1}^{T}i)(f(T)=sumlimits_{dmid T}mu(d)d^2),则

    [S=sumlimits_{T=1}^{n}sum(lfloorfrac{n}{T} floor)^2f(n) ]

    可以发现,(sum(n)) 可以在 (O(1)) 内快速求解

    因此我们可以先预处理 (f(n)) 的前缀和,然后对 (sum(lfloorfrac{n}{T} floor)^2) 进行数论分块即可,最后还要记得将 (S) 带回原式

    这样,我们就可以在 (O(nln n)) 预处理,(O(sqrt n)) 的时间复杂度内求解这个问题

    例题2

    pyh的求和

    例题3

    DZY Loves Maths

  • 相关阅读:
    Android新手之旅(5) 网络资源
    Android新手之旅(10) 嵌套布局
    vertest
    Android新手之旅(4) 通过HTTP访问web
    Android新手之旅(6) 与.Net不同之处
    Android新手之旅(7) RadioButton的自定义
    Android新手之旅(9) 自定义的折线图
    Android新手之旅(8) ListView的使用
    ECLIPSE 安装及与CDT 的使用 多线程编程
    Eclipse的代码提示背景是黑色
  • 原文地址:https://www.cnblogs.com/ezlmr/p/14340110.html
Copyright © 2011-2022 走看看