• 除法分块及其应用


    前言

    除法分块,是数论题中一个比较常见的优化技巧,可以将某些(O(n))算法优化成(O(sqrt n))

    主要思想

    让我们来看一下这个式子:(sum_{i=1}^Nlfloorfrac Ni floor)

    不难发现,在一定范围内(lfloorfrac Ni floor)的值是保持不变的(这个范围是(isimlfloorfrac N{lfloorfrac Ni floor} floor))。

    如果用(l)表示(i)(r)表示(lfloorfrac N{lfloorfrac Ni floor} floor),由于这段的值是一样的(均为(lfloorfrac Ni floor)),而个数又是已知的(即(r-l+1)个),所以我们可以快速算出这一段值的和为((r-l+1)*lfloorfrac Ni floor)

    也就是说,在值不变的情况下,我们是可以(O(1))求解答案的。

    (lfloorfrac Ni floor)的值实际上总共只有大约(sqrt N)种。

    于是,我们就将(O(N))优化至了(O(sqrt N))

    推广

    但除法分块不只限于这一个方面,实际上,对于带整除的函数它也能搞。

    如求(sum_{i=1}^Nmu(lfloorfrac Ni floor))

    我们可以像前面一样表示出(i,l,r),则每次答案就是((r-l+1)*mu(lfloorfrac Ni floor))

    时间复杂度同样得到了极大的优化。

    具体应用

    有一道比较好的除法分块的例题:【BZOJ1257】[CQOI2007] 余数之和

    当然,除法分块的应用还是十分广泛的,例如莫比乌斯反演的题目中就常常可以见到它的身影:

    【洛谷2257】YY的GCD

    【BZOJ1101】[POI2007] Zap

    【BZOJ3994】[SDOI2015] 约数个数和

    这些都是比较经典的题目吧。

  • 相关阅读:
    人物装备的选取
    状压 + 背包
    村庄之间建立邮局
    woj
    括号匹配算面积(模拟)
    流程控制之if
    周末练习题(第一周)
    day04作业
    流程控制之for
    Python流程控制之while
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/divide.html
Copyright © 2020-2023  润新知