• 杜教筛


    杜教筛


    作用:用来求积性函数前缀和,时间复杂度为(O(n^frac{2}{3}))


    积性函数

    若对于函数 (f(x)) 满足 (f(x)=f(a)*f(b)) ,其中 (x=a*b)(gcd(a,b)=1),那么 (f(x)) 为积性函数。

    常见积性函数:

    1. (mu()) ——莫比乌斯函数。
    2. (phi()) ——欧拉函数。(phi(n)=sum_{i=1}^n [gcd(n,i)=1])
    3. (d()) ——约数个数。(d(n)=sum_{i=1}^n[i|n])
    4. (sigma()) ——约数和函数。(sigma(n)=sum_{i=1}^n[i|n]*i)

    积性函数中的特殊存在完全积性函数,即不需满足 (gcd(a,b)=1) 的积性函数。

    常见的完全积性函数:

    1. $ epsilon()$ ——元函数。$ ϵ(n)=[n=1]$
    2. (I()) ——恒等函数。(I(n)=1)
    3. (id()) ——单位函数。(id(n)=n)

    狄利克雷卷积,假设符号为 (*)

    定义:两个数论函数的狄利克雷卷积为 ((f*g)(n)=sum_{d|n} f(d)*g(frac{n}{d}))

    很显然,狄利克雷卷积满足以下运算规律:

    1. 交换律 ((f∗g=g∗f))
    2. 结合律 (((f∗g)∗h=f∗(g∗h)))
    3. 分配律 (((f+g)∗h=f∗h+g∗h))

    举例:对于数论函数 (f)(f=f*epsilon)


    杜教筛

    假设我们要计算 (sum_{i=1}^n f(i)) ((f(i))为积性函数)

    第一步: 构造两个积性函数 (h)(g) ,使得 (h=f*g)

    第二部:推式子,设 (S(n)=sum_{i=1}^n f(i))

    [sum_{i=1}^n h(i)=sum_{i=1}^n sum_{d|i}g(d)*f(frac{n}{d}) ]

    [sum_{i=1}^n h(i)=sum_{d=1}^n g(d)*sum_{i=1}^leftlfloorfrac{n}{d} ight floor f(i) ]

    [sum_{i=1}^n h(i)=sum_{d=1}^n g(d)*S(leftlfloorfrac{n}{d} ight floor) ]

    接着,我们将右边式子的第一项给提出来,可以得到:

    [sum_{i=1}^n h(i)=g(1)*S(n)+sum_{d=2}^n g(d)*S(leftlfloorfrac{n}{d} ight floor) ]

    [g(1)*S(n)=sum_{i=1}^n h(i)-sum_{d=2}^n g(d)*S(leftlfloorfrac{n}{d} ight floor) ]

    这样的话,(S(n)) 就可以递归求解。

    对于积性函数 (h)(g) 选择要靠自己总结。


    小试身手

    假如我们要求的 (f) 函数为 (mu) ,显然 (epsilon=mu*I) ,即 (h) 函数为 (epsilon)(g) 函数为 (I)

    代入到上面杜教筛的式子中,(I(1)*S(n)=sum_{i=1}^nepsilon(i)-sum_{d=2}^n I(d)*S(leftlfloorfrac{n}{d} ight floor))

    (S(n)=1-sum_{d=2}^n S(leftlfloorfrac{n}{d} ight floor))(leftlfloorfrac{n}{d} ight floor) 明显可以整除分块。

    整除分块、记忆化搜索即可。

    假如我们要求的 (f) 函数为 (phi) ,显然 (id=phi*I) ,即 (h) 函数为 (id)(g) 函数为 (I)

    代入到上面杜教筛的式子中,(I(1)*S(n)=sum_{i=1}^nid(i)-sum_{d=2}^n I(d)*S(leftlfloorfrac{n}{d} ight floor))

    (S(n)=frac{(n+1)*n}{2}-sum_{d=2}^n S(leftlfloorfrac{n}{d} ight floor))(leftlfloorfrac{n}{d} ight floor) 明显可以整除分块。

    整除分块、记忆化搜索即可。

    假如我们要求的 (f) 函数为 (d) (约数个数函数) ,用莫反推得 (I=d*mu) ,即 (h) 函数为 (I)(g) 函数为 (mu)

    代入到上面杜教筛的式子中,(mu(1)*S(n)=sum_{i=1}^nI(i)-sum_{d=2}^n mu(d)*S(leftlfloorfrac{n}{d} ight floor))

    (S(n)=n-sum_{d=2}^n mu(d)*S(leftlfloorfrac{n}{d} ight floor))(mu) 前缀和可以再用一次杜教筛。

    整除分块、记忆化搜索即可。


    总结:杜教筛思维上并不是很难,但需要基础数论知识较多。

  • 相关阅读:
    react-native 调用原生方法
    react-native 生命周期
    查看ubuntu系统信息
    Python之DataFrame将列作为索引
    Python之读取文本文件
    Python 之 直接赋值、Deepcopy、Copy区别
    Python之time与datetime模块
    Python之连接MySQL数据库,执行建表语句
    Python之读取csv文件
    MySQL之count() 函数
  • 原文地址:https://www.cnblogs.com/zsjz-yzy/p/15374448.html
Copyright © 2020-2023  润新知