Min_25筛 学习笔记
这儿只是一个简单说明/概括/总结。
原理见这:
https://www.cnblogs.com/cjyyb/p/9185093.html
https://www.cnblogs.com/zhoushuyu/p/9187319.html
首先计算\[g(n,j)=\sum_if(i),\quad i是质数\ 或\ i的最小质因子严格大于P_j\\g(n,j)=\begin{cases}g(n,j-1)&P_j^2\gt n\\ g(n,j-1)-f(P_j)\left[g(\frac{n}{P_j},j-1)-\sum_{i=1}^{j-1}f(P_i)\right]&P_j^2\le n\end{cases}\]
类似埃氏筛法,\(P(n,j)\)就是筛\(j\)次后剩下的数的\(f\)和,再加上所有质数\(p\)的\(f(p)\)之和。
\(P_j^2>n\)时,这一次筛不会筛掉任何数,所以就是\(g(n,j-1)\)。
\(P_j^2\leq n\)时,考虑第\(j\)次筛掉了哪些数,也就是最小质因子是\(P_j\)的那些数。因为是积性函数,所以我们直接提出一个\(P_j\)(来保证它含\(P_j\))。
要被筛掉的数在除掉一个\(P_j\)后的最小质因子一定仍大于等于\(P_j\)(否则在之前就被筛掉了),这符合\(g(\frac{n}{P_j},j-1)\)的定义。所以减掉一个\(f(P_j)g(\frac{n}{P_j},j-1)\)。但是\(g(\frac{n}{P_j},j-1)\)还包含所有质数的\(f(p)\)之和,所以再加上\(\sum_{i=1}^{j-1}f(P_i)\)。
那初值呢?先把所有合数的\(f\)的计算方式看做和质数一样,以便对所有数的\(f\)值快速求个和,用它作为\(g(n,0)\)(注意这里不考虑\(1\))。这样虽然合数的\(f\)值是假的,但是\(g(n,|P|)\)还是能正确的表示所有质数\(p\)的\(f(p)\)之和。
现在考虑算上合数的\(f\)值求和。令\[S(n,j)=\sum_if(i),\quad i是质数\ 或\ i的最小质因子大于等于P_j\]
我们把\(S(n,j)\)分两部分计算,一是所有质数的贡献,二是所有合数的贡献。对于\(f(1)\)最后单独算下。
那么所有质数的贡献可以用\(g\)表示,也就是\(g(n,j)-\sum_{i=1}^{j-1}f(P_i)\)(因为最小质因子要大于等于\(P_j\),所以把那些减掉)。
对于合数,枚举这个合数的最小质因子及其次数,用\(f\)是积性函数的性质直接算:\[S(n,j)=g(n,j)-\sum_{i=1}^{j-1}f(P_i)+\sum_{k=j}^{P_k^2\leq n}\sum_{e=1}^{P_k^{e+1}\leq n}\left[f(P_k^e)\times S(\frac{n}{P_k^e},k+1)+f(P_k^{e+1})\right]\]
\(f(P_k^{e+1})\)是\(S\)没有考虑的那部分(就是\(P_k^{e+1}\),质数的若干次幂这样的合数,而\(S(..,k+1)\)就把这些数忽略掉了)。
答案就是\(S(n,1)+f(1)\)。
流程:
把所有合数看做质数,求一遍和,得到初值\(g(n,0)\)。同时预处理一个\(f(P_i)\)的前缀和。
用\[g(n,j)=\begin{cases}g(n,j-1)&P_j^2\gt n\\ g(n,j-1)-f(P_j)\left[g(\frac{n}{P_j},j-1)-\sum_{i=1}^{j-1}f(P_i)\right]&P_j^2\le n\end{cases}\]
计算\(g(x,|P|)\)(把第二维滚动掉)。用\[S(n,j)=g(n,j)-\sum_{i=1}^{j-1}f(P_i)+\sum_{k=j}^{P_k^2\leq n}\sum_{e=1}^{P_k^{e+1}\leq n}\left[f(P_k^e)\times S(\frac{n}{P_k^e},k+1)+f(P_k^{e+1})\right]\]
计算\(S(n,1)+f(1)\)。
计算\(S,g\)的复杂度都是\(O(\frac{n^{\frac34}}{\log n})\)。
对于其它积性函数,同\(g\)一样计算。
实现上,筛\(sqrt(n)\)内的质数这一步往往可以省略,见这里。
例题:
LOJ6235 区间素数个数
BZOJ3944 Sum
LOJ6053 简单的函数
以后要做的题:
https://cmxrynp.github.io/2018/12/03/Min-25筛学习笔记/
https://blog.csdn.net/koishi_514/article/details/79485534
https://blog.csdn.net/HOWARLI/article/details/80339931
Min_25筛 学习笔记的更多相关文章
- Min_25 筛 学习笔记
原文链接https://www.cnblogs.com/zhouzhendong/p/Min-25.html 前置技能 埃氏筛法 整除分块(这里有提到) 本文概要 1. 问题模型 2. Min_25 ...
- min_25筛学习笔记【待填坑】
看见ntf和pb两位大佬都来学了,然后就不自觉的来学了. 我们考虑这样一个问题. $$ans=\sum_{i=1}^nf(i)$$其中$1\leq n\leq 10^{10}$ 其中$f(i)$是一个 ...
- 洲阁筛 & min_25筛学习笔记
洲阁筛 给定一个积性函数$F(n)$,求$\sum_{i = 1}^{n}F(n)$.并且$F(n)$满足在素数和素数次幂的时候易于计算. 显然有: $\sum_{i = 1}^{n} F(n) = ...
- Min_25筛学习笔记
感觉好好用啊 Luogu上的杜教筛模版题一发 Min_25抢到了 rank1 $ Updated \ on 11.29 $被 STO txc ORZ踩爆啦 前言 $ Min$_$25$筛可以求积性函数 ...
- $Min\_25$筛学习笔记
\(Min\_25\)筛学习笔记 这种神仙东西不写点东西一下就忘了QAQ 资料和代码出处 资料2 资料3 打死我也不承认参考了yyb的 \(Min\_25\)筛可以干嘛?下文中未特殊说明\(P\)均指 ...
- Powerful Number 筛学习笔记
Powerful Number 筛学习笔记 用途 \(Powerful\ number\) 筛可以用来求出一类积性函数的前缀和,最快可以达到根号复杂度. 实现 \(Powerful\ number\) ...
- Min_25筛 学习小记
前言 为什么叫学习小记呢?因为暂时除了模板题就没有做其他的东西了.(雾 这个东西折磨了我一整天,看得我身不如死,只好结合代码理解题解,差点死在机房.(话说半天综合半天竞赛真是害人不浅) 为了以后忘了再 ...
- min-25筛学习笔记
Min_25筛简介 \(\text{min_25}\)筛是一种处理一类积性函数前缀和的算法. 其中这类函数\(f(x)\)要满足\(\sum_{i=1}^{n}[i\in prime]\cdot f( ...
- min_25 筛学习小记
min_25筛 由 dalao min_25 发明的筛子,据说时间复杂度是极其优秀的 \(O(\frac {n^{\frac 3 4}} {\log n})\),常数还小. 1. 质数 \(k\) 次 ...
随机推荐
- shell 判断目录是否存在
判断/data/www/logs/wos_log/crontab_log是否, 如果不存在则新建 if [ ! -d "/data/www/logs/wos_log/crontab_log& ...
- less 写关键帧动画
@keyframes 关键帧动画写在less里的时候,务必要写在所有的{}之外,不能被{}包裹 甚至务必写在代码的最后 不然报错 Compilation resulted in incorrect C ...
- hive建表范例
建表范例:支持update和delete create table aaa( id string, visitor_name string ) clustered by(id) into bucket ...
- Spring Cloud与Spring Boot版本匹配关系
Spring Cloud是什么? “Spring Cloud provides tools for developers to quickly build some of the common pat ...
- PHP SOAP 发送XML
<?php $xmldata = <<<EOT <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap. ...
- java 环境安装
因为现在的java安装需要点击同意许可才能安装,造成了在linux中使用wget命令下载无法正常完整下载,即便下载下来也是不完整的 安装会提示 no such file等一堆提示 我们使用参数如下的命 ...
- 1000. A+B Problem
Description Calculate a+b Input Two integer a,b (0<=a,b<=10) Output Output a+b Sample Input 1 ...
- linux后台执行./run.py提示python syntax error near unexpected token `('
python脚本中的#!/usr/bin/python 估计有不少人注意过一些python脚本开头有这么行东东: #!/usr/bin/python 它是用来干嘛的?貌似没有它对脚本功能也没啥 ...
- 设置VMware10开机自启动并同时启动虚拟机镜像系统
首先,进入VMware Workstation的安装目录 C:\Program Files (x86)\VMware\VMware Workstation
- DataFrames和Kudu
Kudu为Kudu表提供了一个自定义的原生数据源.可以和DataFrame API紧密集成: 使用DataFrame的好处就是可以从很多的数据源创建dataframe,包括现有的RDD,Hive表或S ...