• 杜教筛


    对于一般的欧拉线性筛,(O(n))确实很优秀,但有些毒瘤题,数据范围硬是达到了(1e8)以上

    对于这种情况,就要用到杜教筛了

    套路式:

    有积性函数(h)(g),且(h=f*g),求 (sumlimits_{i=1}^n f(i))

    (S(n)=sumlimits_{i=1}^n f(i))

    (sumlimits_{i=1}^n h(i)=sumlimits_{i=1}^n sumlimits_{d|n} g(d)f(dfrac{i}{d}))

    (~~~~~~~~~~~=sumlimits_{d=1}^n g(d) sumlimits_{i=1}^{leftlfloordfrac{n}{d} ight floor}f(i))

    ( herefore sumlimits_{i=1}^n h(i)=sumlimits_{d=1}^n g(d)S(leftlfloordfrac{n}{d} ight floor))

    (~~~~~~~~~~~~~~=g(1)S(n)+sumlimits_{d=2}^n g(d)S(leftlfloordfrac{n}{d} ight floor))

    ( herefore g(1)S(n)=sumlimits_{i=1}^n h(i)-sumlimits_{d=2}^n g(d)S(leftlfloordfrac{n}{d} ight floor))

    例题:

    来看一个式子(S(n)=sumlimits_{i=1}^n mu(i)),则在这里面(f=mu)

    (g(1)S(n)=sumlimits_{i=1}^n h(i)-sumlimits_{d=2}^n g(d)S(leftlfloordfrac{n}{d} ight floor))再看这个式子,我们找一个积性函数替换(g),使得原式计算更简单

    (I(1)S(n)=sumlimits_{i=1}^n epsilon(i)-sumlimits_{d=2}^n I(d)S(leftlfloordfrac{n}{d} ight floor) Longrightarrow S(n)=1-sumlimits_{d=2}^n S(leftlfloordfrac{n}{d} ight floor))

    整除分块就好了

    毒瘤的出题人才不会让你这么简单看出来:(S(n)=sumlimits_{i=1}^nicdot varphi(i))

    一般这个时候带进卷积会更易观察:(sumlimits_{d|n}(dcdotvarphi(d))cdot g(frac{n}{d}))

    (g)换成(id)根据欧拉函数的性质就容易消掉了

    [sum_{d|n}(dcdotvarphi(d))cdot frac{n}{d}=sum_{d|n}ncdotvarphi(d)\ o=nsum_{d|n}varphi(d)=n^2 ]

    最终变式:$$S(n)=sum_{i=1}^{n}i^2-sum_{d=2}^{n}dcdot S(lfloorfrac{n}{d} floor)$$

  • 相关阅读:
    利用同步辅助类CountDownLatch计算多线程的运行时间
    i++的原子性问题
    Volatile关键字以及线程的内存可见性问题
    创建线程的第三种方式以及简单使用
    java8新特性-lambda表达式和stream API的简单使用
    springboot整合activemq
    springboot整合redis单机及集群
    JAVA-基础(一)
    CentOS-文件操作
    理解AngularJS的作用域Scope
  • 原文地址:https://www.cnblogs.com/y2823774827y/p/10219701.html
Copyright © 2020-2023  润新知