zoukankan      html  css  js  c++  java
  • [总结] min-25筛

    不保证能看懂


    再不写总结我又会忘掉啊啊啊啊啊啊啊啊啊

    这个(min-25)筛主要用来求一个积性函数的前缀和,就像这样$$sum_{i=1}^n f(i)$$
    不过这个积性函数要满足两个条件:质数(p)的函数值(f(p))有个多项式表达,(f(p^c))能够快速计算

    (min-25)筛求前缀和的过程可以看成把所有数贡献分成质数贡献和合数贡献计算(可能有(1)的贡献).先考虑质数的贡献

    ...

    好像除了暴力没有更好的办法啊

    不过可以发现一个数(>sqrt{n})的质因子最多只有一个,也就是任意合数至少会有一个(lesqrt{n})的质因子,所以可以枚举(lesqrt{n})的质因数筛掉合数的贡献.

    后面记(P)为质数集合,(P_j)为从小到大第(j)个质数.这里设(g(n,j))表示(le n)的所有质数以及最小质因数(>P_j)的数的(sum p^k).考虑从(g(n,j-1))转移到(g(n,j)),如果(P_j>sqrt{n}),那么所有数都是质数了,所以可以直接赋值过来;否则还要减去最小质因子(=P_j)的数贡献.先把所有这样的数(/ P_j),除完后(i)对应到(frac{i}{P_j}),同时最小质因子也要满足(ge P_j),所以这一部分就是(f(P_j)g(lfloorfrac{n}{P_j} floor,j-1)).不过这样也减去了一些(<P_j)的质数的贡献,要加回来,所以综上所述,转移可以这样写

    (g(n,j)=egin{cases}g(n,j-1)&P_jge sqrt{n}\ g(n,j-1)-{P_j}^k(g(lfloorfrac{n}{P_j} floor,j-1)-g(P_j-1,j-1))&P_j< sqrt{n}end{cases})

    那个(g(P_j-1,j-1))就是(sum_{k=1}^{j-1}f(P_k))

    可以发现(g(n,|P|))就是所有(le n)质数的贡献(记最大的(le sqrt{n})的质数为(P_m),其实只要做到(g(n,m))就行了)

    后面记(g(n,j))(sum_{pin Prime} f(p)),可以代入之前算的(sum p^k)计算得到

    然后考虑要求的,类似于上面过程,记(S(n,j))(le n)所有最小质因子(ge P_j)的数的贡献.首先考虑质数的贡献,也就是$$sum_{k=j}^{|P|}f(P_k)=g(n,m)-g(P_j-1,j-1)$$

    然后是合数贡献.先枚举那些合数的最小质因子(P_k),然后枚举它的出现次数(c),那么剩下数的贡献是(S(lfloorfrac{n}{{P_k}^c} floor,k+1)),因为是积性函数,所以这一部分的乘上(f({P_k}^c))就是对应的数的贡献.但是这样子没有算到({P_k}^c)的贡献,所以额外加上,转移可以这样写

    (S(n,j)=g(n,m)-g(P_j-1,j-1)+sum_{kge j}sum_{c}f({P_k}^c)(S(lfloorfrac{n}{{P_k}^c} floor,k+1)+[c>1]))

    然后递归处理即可

    还有就是做的时候,只有形如(lfloorfrac{n}{i} floor)这样的数才是有用的,所以可以给每个这样的数编号,就能用数组代替map

    例题先咕了

  • 相关阅读:
    【linux基础】linux系统日志设置相关记录
    【linux基础】mount: unknown filesystem type 'exfat'
    [c++]float assign
    第6章 移动语义和enable_if:6.1 完美转发
    第5章 技巧性基础:5.7 模板模板参数
    第5章 技巧性基础:5.6 变量模板
    第5章 技巧性基础:5.4 原生数组和字符串字面量的模板
    第5章 技巧性基础:5.3 this->的使用
    第5章 技巧性基础:5.2 零初始化
    第5章 技巧性基础:5.1 关键字typename
  • 原文地址:https://www.cnblogs.com/smyjr/p/11083723.html
Copyright © 2011-2022 走看看