zoukankan      html  css  js  c++  java
  • [学习笔记] 杜教筛

    最近沉迷多项式很久了...突然遇到数论题发现不能不过脑子打出杜教筛了...

    几十天前学的这玩意吧...比Min_25筛好理解多了...

    式子挺容易推的, 放在这里以备快速查找吧

    设我们要计算的是 $S(n)=sumlimits_{k=1}^nf(k)$, 其中 $f(x)$ 是一个积性数论函数, 则我们构造两个容易求和的积性函数 $h$ 和 $g$, 使它们满足:

    $$h=f*g$$

    于是我们推一推式子:

    $$
    egin {align}
    sum_{i=1}^nh(i)&=sum_{i=1}^nsum_{d|i} g(d)fleft(frac i d ight)\
    &=sum_{d=1}^ng(d)sum_{i=1}^{leftlfloor frac{n}{d} ight floor}f(i)\
    &=sum_{d=1}^{n}g(d)cdot Sleft(leftlfloor frac n d ight floor ight )\
    &=g(1)cdot S(n)+sum_{d=2}^{n}g(d)Sleft(leftlfloor frac n d ight floor ight )\\
    g(1)S(n)&=sum_{i=1}^{n}h(i)-sum_{d=2}^{n}g(d) Sleft(leftlfloor frac n d ight floor ight )
    end {align}
    $$

    数论题的本质就是枚举约数转枚举系数(倍数)

    我们容易得到一个结论: 积性数论函数除了 $f(x)=0$ 之外都满足 $f(1)=1$, 于是我们就有了:

    $$S(n)=sum_{i=1}^nh(i)-sum_{d=2}^ng(d)Sleft(leftlfloor frac n d ight floor ight )$$

    然后递归下去算就可以了. 直接记忆化一下复杂度是 $O(n^{3/4})$ 左右?

    其中一个原因大概是因为我们有下式:

    $$ left lfloor frac { left lfloor frac n d ight floor} k ight floor = left lfloor frac n {kd} ight floor $$

    实际上我们在记忆化的时候也就顺便把所有 $S(left lfloor frac n d ight floor)$ 处的值都求了. 而莫比乌斯反演也刚好用到的是这些值.

    优化一下, 用线性筛预处理一下前 $n^{2/3}$ 个点的前缀和, 总复杂度就变成 $O(n^{2/3})$ 了.

    记忆化的时候有个技巧, 因为有上面那个除法取整的式子, 所以所有大于 $sqrt n$ 且需要记忆化的点 $d$ 的 $left lfloor frac n d ight floor$ 值一定都不相等, 直接以下标 $left lfloor frac n d ight floor$ 存就可以了, 不需要Hash表.

  • 相关阅读:
    洛谷P2124 奶牛美容
    UVA10325 The Lottery
    CF979C Kuro and Walking Route
    洛谷P4318 完全平方数(莫比乌斯函数)
    hdu2204 Eddy's爱好(莫比乌斯函数)
    LOJ#6053. 简单的函数(min_25筛)
    洛谷P5325 【模板】Min_25筛
    超级码力在线编程大赛初赛 第3场 2.房屋染色
    超级码力在线编程大赛初赛 第3场 3.字符串游戏(Anti-Nim)
    超级码力在线编程大赛初赛 第3场 1.最大公倍数
  • 原文地址:https://www.cnblogs.com/rvalue/p/10237343.html
Copyright © 2011-2022 走看看