min_25筛

用来干啥?

考虑一个积性函数\(F(x)\),用来快速计算前缀和\[\sum_{i=1}^nF(i)\]

当然,这个积性函数要满足\(F(x),x\in Prime\)可以用多项式表示

同时,\(F(x^k),x\in Prime\)要能够快速计算答案

需要预处理的东西

先不考虑求前缀和的问题,考虑一个积性函数\(F(x)\)

求解\[\sum_{i=1}^n[i\in Prime]F(i)\]

直接求我也会懵逼的,还是找一个函数来算算,假设\(F(x)=x^k\)

那么,求解\[\sum_{i=1}^n[i\in Prime]i^k\]

设\(P\)是质数集合,\(P_i\)表示第\(i\)个质数。

设\[g(n,j)=\sum_{i=1}^ni^k[i\in P\ or \ min(p)>P_j,p|i,p\in P\ ]\]

你问我为什么不写中文?因为LaTex里面写中文太丑了

翻译成人话,\(i\)是质数,或者\(i\)的最小质因子大于\(P_j\)

我们考虑一下\(g(n,j)\)这个函数可以怎么转移。

考虑第一种情况,如果\(P_j^2>n\),很明显,最小质因子是\(P_j\)的最小合数就是\(P_j^2\)

如果\(P_j^2> n\),显然不会产生新的贡献了,此时有\(g(n,j)=g(n,j-1)\)

那么,如果\(P_j^2\le n\)呢?

显然,从\(P_{j-1}\)到\(P_j\),我们能够产生贡献的值变少了,因此我们要减去一些东西的值。

所以\(g(n,j)=g(n,j-1)-X\),考虑一下\(X\)是啥。

我们减去的贡献显然就是哪些最小质因子是\(P_{j}\)的东西,所以前面有一个\(P_{j}^k\)的系数,

后面有还有一些东西。

现在因为所有数都分成了两个部分,一个是已经被提出来的\(P_{j}\),另外一部分是剩余的数。

考虑剩余的数的最小质因数,我们要减去的就是那些最小质因数仍然大于等于\(P_{j}\)的那部分

所以容斥一下,先算上所有的含有\(P_{j}\)这部分的贡献\(g(\frac{n}{P_{j}},j-1)\)

再减掉其他质数以及最小质因数小于\(P_j\)的那部分,也就是\(g(P_j-1,j-1)\)

所以我们推出转移

\[g(n,j)=g(n,j-1)-P_{j}^k[g(\frac{n}{P_{j}},j-1)-g(P_j-1,j-1)]\]

把两个转移合并一下,就是
\[
g(n,j)=
\begin{cases}
g(n,j-1)&P_j^2\gt n\\
g(n,j-1)-P_{j}^k[g(\frac{n}{P_j},j-1)-g(P_j-1,j-1)]&P_j^2\le n
\end{cases}
\]
考虑一下\(g(P_{j},j)\)的值?显然是\[\sum_{i=1}^jP_j^k\]

我们要求的是什么?\(g(n,|P|)\),其中\(|P|\)是\(Prime\)集合的大小,也就是满足条件的质数的个数。

而我们根据上面的转移,发现需要的质数只有不大于\(\sqrt n\)的,所以只需要筛出这些质数就好了。

我们来思考一下\(g\)函数所代表的含义,

我们可以理解为在模拟埃氏筛法的过程,

\(g(n,j)\)表示\([1,n]\)排成一列放在这里,但是你已经晒过一些质数了,

你把前\(j\)个质数的倍数全部划掉了,剩下的求个\(F(x)\)的和就是\(g\)函数。

所以转移的过程可以理解为已经筛完了前\(j-1\)个质数,现在考虑删除第\(j\)个质数的过程。

看到这里一定会感觉上面十分的有道理,但是又有一些疑问。

在上面的计算过程中,始终只考虑了\(\le\sqrt n\)的质数,那么,那些\(\gt\sqrt n\)的质数呢?

其实,我们的\(g\)函数要计算的本来就只有质数的值,所以,我们的\(g\)函数算出来的结果并不是真正的结果。

还记得上面对于这类积性函数有什么要求吗?能够快速的计算\(F(x),x\in Prime\)。

所以,我们先假设所有的数的计算方法都等同于质数的计算方法,所以我们可以快速的计算前缀和

也就是\(g(n,0)\),虽然这个值是假的。但是,如果\(g\)中只包含了质数的值的话,那么它的计算结果就是真正的结果。

因此,预处理\(g\)的过程,我们理解为一个计算所有质数的值的过程。

怎么算我们要的东西呢?

接着我们来考虑求积性函数的前缀和。

设\[S(n,j)=\sum_{i=1}^nF(i)[min(p)\ge P_j,p\in P,p|i\ ]\]

后面的意思和上面是一样的,也就是所有最小质因数大于\(P_j\)的\(i\)的\(F(i)\)之和

那么,\(S(n,j)\)分为两个部分计算,一部分是所有质数的和,一部分是所有合数的和,\(1\)的值单独算一下。

所有质数的值显然可以用\(g\)表示出来,也就是\(g(n,|P|)\),当然,这里还需要考虑一下质数大小的限制

考虑合数部分的贡献。

枚举一下每个合数的最小质因子以及最小质因子的次幂,这样可以进行转移。

\[S(n,j)=g(n,|P|)-\sum_{i=1}^{j-1}f(P_i)+\sum_{k\ge j}\sum_{e}(F(P_k^e)S(\frac{n}{P_k^e},k+1)+F(P_k^{e+1}))\]

为什么?

因为\(F(x)\)是一个积性函数,所以我们把它的最小质因数拆出来,考虑剩下部分然后再乘起来是没有问题的。

所以我们枚举他的最小质因数,然后只需要考虑除完之后剩下部分的答案就好了。

因为最小质因数已经被除完,所以剩下部分中不能再含有最小质因数。

同时,所有的\(F(p_k^i)\)也被筛掉了,所以需要额外的补进来。

一个栗子

LOJ#6053 简单的函数

积性函数为\(f(p^c)=p\oplus c,p\in Prime\)

我们来考虑质数的贡献,因为除\(2\)外的所有质数都是奇数,所以\(f(p)=p-1\)

而\(f(2)=p+1=2+1=3\)

我们先把所有的数的贡献都当做\(p\)来算,这样可以方便我们计算\(g\)的值。

再注意到一点,我们真正在计算\(g(n,j)\)的时候,并不需要计算出所有的\(n\)值

我们发现每次转移的时候只与整除有关,所以考虑一下数论分块后的结果,

这样的值大约只有\(2\sqrt n\)个,所以只需要这些数的值。我们可以预处理出来,然后存起来。

初值计算\[g(n,0)=\sum_{i=2}^nf(i)\]

当然这里的\(f(i)\)是“假的”\(f(i)\),也就是我们把所有的数都当成质数来计算

也就是\(f(i)=i\),所以求和的结果是\(\frac{n(n+1)}{2}-1\)

然后我们看到上面的式子,还需要维护一下筛出来的质数的前缀\(f(x)\)和,也就是\(g(P_i-1,i)\)

这个的话我们在筛质数的时候直接维护一下就好了。

因为对于所有的质数,我们实际的\(f(i)\)是\(i-1\),所以还需要维护一下质数的个数,

也就相当于维护一个积性函数\(h(x)=1\),和前面\(g\)函数一样的计算就行了。

接下来就表示成\(h(n,j)\)了。

然后如何计算答案?

我们采用递归的方法,并且不需要记忆化

先考虑一下\(S(n,j)\)的初值,也就是所有满足条件的质数的答案

这个答案是\[g(n,|P|)-\sum_{i=1}^{j-1}(P_i-1)-h(n,|P|)\]

为啥?首先是所有质数的\(f(x)\)的值,就是前面的\(g\)函数

然后因为最小的质数是\(P_j\),所以把小于\(P_j\)的质数的贡献给减掉

然后因为要计算的\(f(x)\)是\(x-1\),所以还需要额外减那个\(1\),也就是质数的个数。

如果\(j=1\)的时候,\(f(2)=3\),但是在计算过程中我们算的是\(f(2)=1\),所以需要额外的加二

这样一来就差不多可以实现了。
代码戳这里

min_25筛的更多相关文章

  1. 【UOJ448】【集训队作业2018】人类的本质 min_25筛

    题目大意 给你 \(n,m\),求 \[ \sum_{i=1}^n\sum_{x_1,x_2,\ldots,x_m=1}^i\operatorname{lcm}(\gcd(i,x_1),\gcd(i, ...

  2. Min_25 筛 学习笔记

    原文链接https://www.cnblogs.com/zhouzhendong/p/Min-25.html 前置技能 埃氏筛法 整除分块(这里有提到) 本文概要 1. 问题模型 2. Min_25 ...

  3. UOJ188 Sanrd Min_25筛

    传送门 省选之前做数论题会不会有Debuff啊 这道题显然是要求\(1\)到\(x\)中所有数第二大质因子的大小之和,如果不存在第二大质因子就是\(0\) 线性筛似乎可以做,但是\(10^{11}\) ...

  4. 【SPOJ】DIVCNTK min_25筛

    题目大意 给你 \(n,k\),求 \[ S_k(n)=\sum_{i=1}^n\sigma_0(i^k) \] 对 \(2^{64}\) 取模. 题解 一个min_25筛模板题. 令 \(f(n)= ...

  5. 【51NOD1847】奇怪的数学题 min_25筛

    题目描述 记\(sgcd(i,j)\)为\(i,j\)的次大公约数. 给你\(n\),求 \[ \sum_{i=1}^n\sum_{j=1}^n{sgcd(i,j)}^k \] 对\(2^{32}\) ...

  6. 【51NOD1965】奇怪的式子 min_25筛

    题目描述 给你\(n\),求 \[ \prod_{i=1}^n{\sigma_0(i)}^{i+\mu(i)} \] 对\({10}^{12}+39\)取模. \(\sigma_0(i)\)表示约数个 ...

  7. 关于 min_25 筛的入门以及复杂度证明

    min_25 筛是由 min_25 大佬使用后普遍推广的一种新型算法,这个算法能在 \(O({n^{3\over 4}\over log~ n})\) 的复杂度内解决所有的积性函数前缀和求解问题(个人 ...

  8. 51Nod1222 最小公倍数计数 数论 Min_25 筛

    原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1222.html 题意 给定 $a,b$, 求 $$\sum_{n=a}^b \sum_{i=1}^n ...

  9. LOJ6053 简单的函数 【Min_25筛】【埃拉托斯特尼筛】

    先定义几个符号: []:若方括号内为一个值,则向下取整,否则为布尔判断 集合P:素数集合. 题目分析: 题目是一个积性函数.做法之一是洲阁筛,也可以采用Min_25筛. 对于一个可以进行Min_25筛 ...

随机推荐

  1. clCreateBuffer和clCreateBuufer + clEnqueueWriteBuffer

    有两种方式实现从主机到CL设备的数据传递, 第一种: cl_mem input = clCreateBuffer(context,CL_MEM_READ_ONLY,sizeof(float) * DA ...

  2. Android 网络框架 Retrofit2

    概述 Retrofit是一个OkHttp网络请求框架的封装库,Retrofit通过注解配置网络参数,可以按照我们的规则去构造实际的HTTP请求,能够灵活设置URL.头部.请求体.返回值等,是目前最优雅 ...

  3. Android 中使用 dlib+opencv 实现动态人脸检测

    1 概述 完成 Android 相机预览功能以后,在此基础上我使用 dlib 与 opencv 库做了一个关于人脸检测的 demo.该 demo 在相机预览过程中对人脸进行实时检测,并将检测到的人脸用 ...

  4. 2019Java查漏补缺(一)

    看到一个总结的知识: 感觉很全面的知识梳理,自己在github上总结了计算机网络笔记就很累了,猜想思维导图的方式一定花费了作者很大的精力,特共享出来.原文:java基础思维导图 自己学习的查漏补缺如下 ...

  5. [Web][DreamweaverCS6][高中同学毕业分布去向网站+服务器上挂载]一、安装与破解DreamweaverCS6+基本规划

    DreamweaverCS6安装与破解 一.背景介绍:同学毕业分布图项目计划简介 哎哎哎,炸么说呢,对于Web前端设计来说,纯手撕html部分代码实在是难受. 对于想做地图这类的就“必须”用这个老工具 ...

  6. 浅谈TCP IP协议栈(二)IP地址

    上一节大致了解TCP/IP协议栈是个啥东西,依旧是雾里看花的状态,有很多时候学一门新知识时,开头总是很急躁,无从下手,刚学会一点儿,却发现连点皮毛都不算,成就感太低,所以任何时候学习最重要的是要在合适 ...

  7. Asp.Net Core 实现服务的批量注册注入

  8. log4j控制指定包下的日志

    最近观察日志发现如下两个问题: 1.项目用的是springboot项目,整合了rabbitmq,项目启动后,会自动监控rabbitmq谅解是否正常,导致控制台一直输出监控日志,此时就想阻止该类日志输出 ...

  9. Hadoop从入门到精通系列之--0.Hadoop生态体系

    https://blog.csdn.net/Haidaiya/article/details/84568588#%E4%B8%80%20%E5%A4%A7%E6%95%B0%E6%8D%AE%E7%9 ...

  10. 数据库的设计:深入理解 Realm 的多线程处理机制

    你已经阅读过 Realm 关于线程的基础知识.你已经知道了在处理多线程的时候你不需要关心太多东西了,因为强大的 Realm 会帮你处理好这些,但是你还是很想知道更多细节…… 你想知道在 Realm 的 ...