zoukankan      html  css  js  c++  java
  • 杜教筛

    一、前言

    寒假康复训练并承接期末考试前内容

    二、讲解

    1.前置知识:积性函数

    • 常见的积性函数:(varphi,mu,sigma,d)
    • 常见的完全积性函数:(epsilon,I,id)

    其中 (epsilon(n)=[n=1],I(n)=1,id(n)=n)

    2.杜教筛

    我们要求积性函数 (f) 的前缀和 (S(n)=sum_{i=1}^nf(i))

    我们需要另一个积性函数 (g) 与狄利克雷卷积 ((f*g)(n)=sum_{d|n}f(d)*g(frac{n}{d}))

    我们令 (h(n)=sum_{i=1}^nsum_{d|i}f(d)*g(frac{i}{d}))

    (h(n)=sum_{d=1}^nf(d)sum_{d|i}g(frac{i}{d}))

    显然可以互换

    (h(n)=sum_{d=1}^ng(d)sum_{d|i}f(frac{i}{d}))

    改写一下

    (h(n)=sum_{d=1}^ng(d)sum_{i=1}^{lfloorfrac{n}{d} floor}f(i)=sum_{d=1}^ng(d)S(lfloorfrac{n}{d} floor))

    裂开它!

    (h(n)=g(1)S(n)+sum_{d=2}^ng(d)S(lfloorfrac{n}{d} floor))

    (S(n)=frac{h(n)-sum_{d=2}^ng(d)S(lfloorfrac{n}{d} floor)}{g(1)})

    所以我们只需要找到一个合适的函数 (g) ,使得可以快速算出上式的分子即可

    一般可以用到数论分块

    上式所有的 (S) 都可以用这个方法算出来

    所以我们可以预处理一部分,递归处理一部分,加上记忆化,可以用到 ( exttt{hash}) 或者 ( exttt{map})

    其中预处理的部分取 (n^{2/3}) 时最优,但实际上我们开不了这么大的空间,根据实际情况适当调整即可

    这就是杜教筛,时间复杂度可以做到 (O(n^{frac{2}{3}}))暂时不会证明

    三、例题

    1.求 (mu) 的前缀和

    (S(n)=sum_{i=1}^nmu(i))

    我们不难想到这个公式:

    ([n=1]=sum_{d|n}mu(i))

    化!我们令 (h(n)=[n=1],g(n)=1),再套用上面的公式!

    (S(n)=[n=1]-sum_{d=2}^nS(lfloorfrac{n}{d} floor))

    后半部分显然可以数论分块

    2.求 (varphi) 的前缀和

    (S(n)=sum_{i=1}^n varphi(i))

    根据 (id(n)=sum_{d|n}varphi(d))

    (S(n)=frac{(n+1)*n}{2}-sum_{d=2}^nS(lfloorfrac{n}{d} floor))

    后半部分依然可以数论分块

    四、习题

    例一&例二(洛谷)

    神犇和蒟蒻(DarkBZOJ)

    简单的数学题(洛谷)

  • 相关阅读:
    4.回归类算法目标值连续型
    springcloud笔记
    5.聚类算法kmeans
    FastdFS文件系统
    ElasticSearch
    cors解决跨域
    Swagger
    miaosha2:高并发抢购方案
    关于javascript中的constructor与prototype
    eclipse布署项目到weblogic时启动两次的问题
  • 原文地址:https://www.cnblogs.com/PPLPPL/p/14352023.html
Copyright © 2011-2022 走看看