【learning】洲阁筛
问题描述
快速求素数处点值比较好求的积性函数前缀和
大致过程
Step1、求出一定范围内的素数处点值之和(\(g\))
Step2、利用上面的\(g\)求出一个\(f\)然后用\(f\)求出前缀和
具体过程
(这里约定一下,在下面的内容中用\(p\)表示一个素数,用\(P_i\)表示素数列表中的第\(i\)项)
这里以求\(\sum \phi(i)\)为例
首先对于素数\(p\)来说,\(\phi(p)=p-1\)的,因此我们可以快速求出素数处点值的和\(\sum \phi(p)=\sum p - \sum 1\)
这个时候我们定义
\[
\begin{aligned}
g_{i,j}&=\sum\limits_{k=2}^{i}[k与P_1、P_2、P_3...P_j互质或者就是其中的某个素数]k\\
&=\sum\limits_{k=2}^{i}[k是P_j的素数\ 或\ k的最小质因子>P_j]k\\
\end{aligned}
\]
初始化\(g_{i,0}=\sum\limits_{k=2}^{i} k\)
有了这个东西的话我们就可以比较快速的知道某一个范围内的素数处点值的函数值和了
现在考虑\(g_{i,j}\)怎么求,我们考虑从\(g_{i,j-1}\)推到\(g_{i,j}\)
(这里的大体思想其实和。。之前在博客里面写到的某道题pxp。。差不多,或者说pxp其实就是洲阁筛的前半部分)
将具体的含义列出来,我们要做的就是从
\[
满足k<=P_{j-1}的素数\ 或\ k的最小质因子>P_{j-1}的k的和
\]
推到
\[
满足k<=P_j的素数\ 或\ k的最小质因子>P_j的k的和
\]
看一下我们要修改的部分,对于前半部分来说应该是加上一个\(P_j\)(如果在范围内的话),对于后半部分来说应该是减去一些数(不满足第二个条件),这些数满足
\[
x=P_j*(一个y满足最小质因子>P_j,并且范围在[P_j,\lfloor\frac{i}{P_j}\rfloor]的数)
\]
于是乎我们非常愉快地发现后面那个括号里面的那一堆东西的和可以用回\(g\)来容斥一下表示!
\[
\sum y=g_{\lfloor\frac{i}{P_j}\rfloor,j-1}-g_{P_j-1,j-1}
\]
然后我们就可以由\(g_{i,j-1}\)推到\(g_{i,j}\)啦
\[
g_{i,j}=g_{i,j-1}-P_j(g_{\lfloor\frac{i}{P_j}\rfloor,j-1}-g_{P_j-1,j-1})
\]
然而对于不同的积性函数来说,第一步的求法会有一定的差异,也许会有更加简单的求法,反正就是要求出一个函数能够快捷方便滴得到某一个范围内的素数处点值的和就好了
如果一定要写一个通式的话其实就是:
\[
g_{i,j}=g_{i,j-1}-F(P_j)(g_{\lfloor\frac{i}{P_j}\rfloor,j-1}-g_{P_j-1,j-1})
\]
其中满足\(F\)是一个完全积性函数(因为把\(P_j\)提出来那步需要用到完全积性函数的性质,你并不能保证后面的那堆东西一定和\(P_j\)互质)
然后\(F\)的话具体看最开始给的要求前缀和的函数在素数处的点值的表达式具体是啥而定,比如在这个例子里面就是\(F(x)=x\)
接下来是用这个\(g\)来求\(h\)
\[
h_{i,j}=\sum\limits_{k=2}^{i}[k最小质因子>=P_j]\phi(k)
\]
(如果是别的函数的话就换一下后面的\(\phi(k)\)就可以了)
考虑这样一种枚举方式:
每一个数我们都可以拆成
\[
(最小质因子)^q*一些别的东西(可以是1)
\]
所以我们可以将上面的表达式通过枚举素数以及次方的方式写成这样:
\[
h_{i,j}=\sum_{q}\phi(P_j^q)\cdot h_{\lfloor \frac{i}{P_j^q}\rfloor,j+1}
\]
然后就可以推\(h_{i,j}\)啦
然而。。。直接搞会比较麻烦。。因为这里为了保证复杂度还是需要上面提到的\(i>=P_j^2\)的优化,但是这里没有那么简单,而是需要打上标记
所以这里写上另一种方式(貌似是min_25筛来着)
\[
h_{i,j}=\sum_{P_k>=P_j}\sum_{q>=1,P_k^q<=i}\phi(P_k^q)\cdot(h_{\lfloor \frac{i}{P_k^q}\rfloor,j+1}+1)
\]
后面那里要\(+1\)是因为要把\(\phi(P_k^q)\)的部分也算上(否则都是\(一些别的东西\phi(P_k^q*一些别的东西)\))
然后直接大力搜索就可以了
边界条件:\(i<=1\)的时候返回\(0\)
有趣的是,并不需要记忆化ovo
因为可以说明\(h\)是不会被重复调用的%%%
然后最后的答案就是\(h_{n,1}+\phi(1)\)啦
总的来说
额其实就是
\[
\begin{aligned}
g_{i,j}&=g_{i,j-1}-F(P_j)(g_{\lfloor\frac{i}{P_j}\rfloor,j-1}-g_{P_j-1,j-1})\\
\\
h_{i,j}&=\sum_{P_k>=P_j}\sum_{q>=1,P_k^q<=n}f(P_k^q)\cdot h_{\lfloor \frac{i}{P_k^q}\rfloor,j+1}
\end{aligned}
\]
然后\(F\)是完全积性函数,\(f\)是题目给的是一个积性函数,\(F\)是根据\(f\)在素数处点值的表达式构造的
大概是这样嗯ovo
哦然后时间复杂度是\(O(\frac{n^{\frac{3}{4}}}{logn})\)的至于证明的话。。不会qwq
虽然说思路真的巨无敌绕不过弄懂了的话还是比较好理解的ovo(假装这两句话一点都不矛盾)
实现问题
关于实现的话有这样几个比较重要的点单独拿出来说一下
1.Step1中,关于\(g_{i,j}\)的求解:
题目中的\(n\)往往很大,\(i\)直接这么枚举的话直接就愉快爆炸了
这里我们可以发现一个性质,就是我们其实只用关注第一维的\(i\)满足\(i \in \{\lfloor \frac{n}{x} \rfloor|x \in [1,n]\}\)的\(g_{i...}\)值
我们将这个集合记为\(S\),那么是有\(|S|=2\sqrt n\)的,在具体实现的时候,我们可以先离散化一下,需要调用的时候再映射回去就好了
为什么我们可以这么做呢?看回递推式中我们需要的\(g\)的第一维,前一部分是\(\lfloor \frac{i}{P_j} \rfloor\),这是\(\in S\)的,后一部分是\(P_j-1\),因为\(P_j\)我们限制是\(< \sqrt n\)的,所以\(P_j-1\in S\),所以只有\(i\in S\)的\(g_{i,...}\)才是我们实际需要算的值
2.Step2中,关于\(h_{i,j}\)的求解:
同样的,如果第一维直接枚举\(n\)的话简直炸成烟花
这里观察一下当\(i<P_j\)的情况,会发现当\(i<P_j^2\)的时候,能算进来的只有\(且>=P_j且<=i\)的质数处的函数值,所以这一部分的和可以直接用\(g_{i,max+1}-g_{P_j-1,max+1}\)表示,其中\(max\)是素数列表的长度
所以枚举的时候只枚举到\(P_j^2<=i\),然后最后判断一下如果存在\(i<P_j^2\)这种情况的话,就把后面整段的值一起加进返回值里,也就是直接加上\(g_{i,max+1}-g_{P_j-1,max+1}\)
3.关于数组大小的问题。。因为关键位置的集合\(S\)的大小是\(2\sqrt n\),所以相关数组要开\(2\sqrt n\)而不是\(\sqrt n\)
代码的话
看这题好了 Portal -->【SPOJ】DIVCNTK
【learning】洲阁筛的更多相关文章
- 【Learning】积性函数前缀和——洲阁筛(min_25写法)
问题描述 洲阁筛解决的问题主要是\(n\)范围较大的积性函数前缀和. 已知一积性函数\(f(i)\),求\(\sum_{i=1}^nf(i)\). \(n\leq10^{12}\). 求解方法 如 ...
- 杜教筛进阶+洲阁筛讲解+SPOJ divcnt3
Part 1:杜教筛进阶在了解了杜教筛基本应用,如$\sum_{i=1}^n\varphi(i)$的求法后,我们看一些杜教筛较难的应用.求$\sum_{i=1}^n\varphi(i)*i$考虑把它与 ...
- 【XSY3042】石像 拓扑排序 状压DP 洲阁筛
题目大意 有 \(n\) 个整数 \(a_1,a_2,\ldots,a_n\),每个数的范围是 \([1,m]\).还有 \(k\) 个限制,每个限制 \(x_i,y_i\) 表示 \(a_{x_i} ...
- 洲阁筛 & min_25筛学习笔记
洲阁筛 给定一个积性函数$F(n)$,求$\sum_{i = 1}^{n}F(n)$.并且$F(n)$满足在素数和素数次幂的时候易于计算. 显然有: $\sum_{i = 1}^{n} F(n) = ...
- 模板 - 洲阁筛 + min25筛
好像在某些情况下杜教筛会遇到瓶颈,先看着.暑假学一些和队友交错的知识的同时开这个大坑.
- LOJ6053 简单的函数 【Min_25筛】【埃拉托斯特尼筛】
先定义几个符号: []:若方括号内为一个值,则向下取整,否则为布尔判断 集合P:素数集合. 题目分析: 题目是一个积性函数.做法之一是洲阁筛,也可以采用Min_25筛. 对于一个可以进行Min_25筛 ...
- [NOI2016]循环之美(杜教筛)
首先要求每个数互不相等,故有$x\perp y$. 可以发现$\frac{x}{y}$在$k$进制下为纯循环小数的充要条件为$x\cdot k^{len}\equiv x(mod\ y)$,即$y\p ...
- min25筛学习笔记
min25筛简介:用来求积性函数F(x)前缀和的,复杂度O(n0.75/logn),大概能求n<=1010. 记一个数x的最小质因子为R(x),所以当x不为质数时,R(x)<=√x这是废话 ...
- min_25筛入门
目录 1.什么是min_25筛 2.前置知识 2.1.数论函数 2.2.埃拉托色尼筛 2.3.欧拉筛 3.min_25筛 3.1.计算质数贡献 3.2.计算总贡献 3.3.实现 4.例题 4.1.[L ...
随机推荐
- selenium webdriver API详解(二)
本系列主要讲解webdriver常用的API使用方法(注意:使用前请确认环境是否安装成功,浏览器驱动是否与谷歌浏览器版本对应) 一:获取当前页面的title(一般获取title用于断言) from s ...
- linux信号处理相关知识
因为要处理最近项目中碰上的多个子进程退出信号同时到达,导致程序不当产生core的情况,今天我花了时间看了一些关于linux信号处理的博客. 总结一下:(知识未经实践) linux信号分两种,一种实 ...
- 第六章P2P技术及应用
第六章P2P技术及应用 P2P技术在我们日常生活中非常实用,例如我们常用的QQ.PPLive.BitTorrent就是基于P2P技术研发.下面将本章中的重点内容进行归纳. 文章中的Why表示产生的背景 ...
- moment.js学习总结
一. 介绍: moment.js不依赖任何第三方库,支持字符串.Date.时间戳以及数组等格式,可以像PHP的date()函数一样,格式化日期时间,计算相对时间,获取特定时间后的日期时间等等.下面是一 ...
- Base64编码图片存取与前台显示
需求:将Base64编码图片以BLOB类型存入数据库,需要时取出显示 后台: String base64str=new String(log.getRequest_imgdata());//log为实 ...
- 大学网站UI设计分析(以学校领导/历届领导为例)
第一次的冲刺阶段让我过了一把PM的瘾,第一阶段的冲刺完成以后第一感觉就是PM不好当,在大学里做个课程设计当个PM相对而言还是比较容易的,但是我明白,当我们走向工作岗位以后,面临的情况会比学校的情况的复 ...
- HDU 5501 The Highest Mark
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5501 The Highest Mark Accepts: 32 Submissions: 193 ...
- HDU 5391Z ball in Tina Town 数论
题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5391 bc: http://bestcoder.hdu.edu.cn/contests/c ...
- 0330复利计算java版
package compounding; import java.util.Scanner; public class compounding1_1 { public static void main ...
- 软件工程个人作业3——集大通APP案例分析
第一部分:调研, 评测 1.第一次上手体验 主要界面截图: 感受: 1.界面不美观: 2.特色功能展现模块不突出,以上截图为打开APP所看到的界面展示,但是这些功能都不是该APP的特色功能,显得有些累 ...