「关于一种处理关于$p$成多项式的数论函数筛法」
引入:
给一个完全积性函数$f$,求其前缀和
$$S(n)=\sum_{i=1}^nf(i)$$
初步思考:
考虑由于所求函数为完全积性函数,我们很容易用一个线性筛在$O(n)$的时间负责度内解决问题。
但是往往这类问题要求更加优秀的时间负责度,那么线筛便不能满足我们的需要,我们需要更加优秀的做法。
我们考虑一种最基础的筛法:埃拉托斯特尼筛法。
在这种筛法的思路中,我们只需要枚举$\sqrt n$以内的质数,那么我们是否可以引入这种想法呢?
进一步思考:
我们考虑将$S(n)=\sum_{i=1}^n f(i)$换成与质数有关的表达形式。
我们设$\tau(x) = x的最大质因子$。
那么
$$S(n) = \sum _{i=2}^n\sum_{\tau(i)<p,i*p<=n}f(ip) + \sum_{i=2}^nf(i)[\tau^2(i)|i] + f(1) + \sum_{p=2}^n f(p)$$
$$\because \forall a,b\; f(ab)=f(a)f(b)$$
$$\therefore S(n)=\sum_{i=2}^nf(i)\sum_{\tau(i)<p,ip<=n,p==\tau (p)}f(p)+\sum_{i=2}^nf(i)[\tau^2(i)|i]+f(1)+\sum_{p=2}^nf(p)$$
我们来看这个式子。
我们发现前两部分枚举的$i$所含质数$p$必然$p<=\sqrt n$。
那么我们使用DFS来枚举这些$i$会发现枚举量为:$$n-\sum_{i=\sqrt n+1,i=\tau(i)}^n \lfloor \frac{n}{i} \rfloor$$
这个式子我并不会算……
但是通过张博航的博客,这个式子的结果是约等为$\frac{n^{\frac{3}{4}}}{ln n}$存在一定的常数。
思考算法设计:
那么问题就变成了如果去求$\sum_{\tau(i)<p,ip<=n}f(p)$以及$\sum_{p=2,p=\tau(p)}f(p)$。
我们发现后者其实是可以看作于前者是一类的。
那么设$S'(n)=\sum_{p=2,p=\tau(p)}f(p)$,即上式为$S'(\frac{n}{i})-S'(\tau(i))$来表示的。
由于除法分块我们可以知道$\lfloor \frac{n}{i} \rfloor$取值仅有$\sqrt n$级别个,同时$\tau(i) <=\sqrt n$。
那么我们设$$a_i = S'(i),b_i=S'(\frac{n}{i}),i\leqslant \sqrt n$$
那么考虑如何求出$S'$。
我们先将所有数都看做质数,那么此后我们从小到大枚举一个每个小于$\sqrt n$的质数$p$,那么
$$S'(i)=S'(i)-f(p)(S'(\frac{i}{p})-S'(p-1))$$
考虑用数学归纳法证明:
首先当$p==2$时,此式显然得到的是去掉所有含“2”因子的合数。
那么设此式在之前质数中都是正确的,此时枚举到了$p$。同时设$\zeta i = i的最小质因数$
那么我们考虑此时
$S'(x)=\sum_{i=2,i=\tau(p),i<p}f(p) + \sum_{i=p}^x [\zeta(i)>=p]f(i)$
那么
$f(p)(S'(\frac{i}{p})-S'(p-1) )= \sum_{j=p}^{\frac{i}{p}} [\zeta(i)>=p] f(i*p)$
即此时我们给$S'(i)$删去了所含质因数均大于等于$p$的合数。故上式当处理到$\sqrt n$时是正确的。
我们再考虑如何求出$a,b$数组。
显然我们要从小到大枚举每个质数,再从大到小枚举每一个有用的$i$。然后考虑:
1) 若$i>\sqrt n$那么其对应位置一定在$b$数组出现过。
2) 若$\frac{i}{p}>sqrt n$那么其对应位置也必然在$b$中出现,这是由于$i$是由$\frac {n} {j}$得到的。
那么$\frac{i}{p}$就等价于$\lfloor \frac{ \frac{n}{j} }{p} \rfloor= \frac {n} {jp}$显然$jp<=\sqrt n$ 那么其此时$\frac{i}{p}$一定在b中出现过。
3) 若$i<=\sqrt n$ 那么其必然出现在$a$中,$\frac{i}{p}$同理。
也就是说对于用每个$p$来更新$a,b$需要且仅需要$a,b$数组。
考虑求$a,b$的时间复杂度约为:
$ \sum_{i=2,i=\tau i} (2\sqrt n - i^2) $。
这个东西,应该约为$\frac {2n^\frac{3}{4}} {3ln(\sqrt n)}$。考虑枚举第一部分$i$具有常数。这两部分应该是很接近的。
算法使用范围:
假设我们可以将一个函数写成关于$p$的$k$阶多项式形式的话,我们就可以利用上面描述的筛法,在$k\frac{n^\frac{3}{4}}{lnn}$时间内得到答案。
======update======
这个似乎就是min_25筛。
上了SPOJ以后才发现……min_25可能就是Hiroaki Yamanouchi……
「关于一种处理关于$p$成多项式的数论函数筛法」的更多相关文章
- 重学 Java 设计模式:实战备忘录模式「模拟互联网系统上线过程中,配置文件回滚场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 实现不了是研发的借口? 实现不了,有时候是功能复杂度较高难以实 ...
- 一种根据value解释成枚举的有效方法
有时候需要根据实际情况将某个值解释成一个枚举,而不是根据枚举的名称.如有时0是枚举Gender.MALE的值,1是枚举Gender.FEMALE的值:有时0.1又可以是另一个枚举的值,比如0表示Cer ...
- Struts2框架的数据封装一之属性封装(属性封装的第二种方式:封装成javaBean)
Struts2中提供了两类数据封装的方式? 第一种方式:属性驱动(有两种方式:一个对属性,另外一个是将参数封装到javaBean中) B. 在页面上,使用OGNL表达式进行数据封装.(将参数封装到ja ...
- C#种将String类型转换成int型
API: 有一点是需要注意的,那就是必须保证该String类型内全为数字,能确保转换正确: 1.int.Parse(str); 2.TryParse(str, out intA); 3. Conver ...
- 如何评价苹果中国官网 iOS 8 介绍页面的文案「开发者的大事、大快所有人心的大好事」?[转自知乎]
在什么是「苹果式中文」答案中,小七得出了这个结论: 「苹果式中文」是指句子结构破碎,经常缺乏主语,滥用排比,顶真,偏正短语,和不恰当四字词的广告文体. (有关什么是苹果式中文,小七原来贴错地方了TAT ...
- 重学 Java 设计模式:实战享元模式「基于Redis秒杀,提供活动与库存信息查询场景」
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 程序员的上下文是什么? 很多时候一大部分编程开发的人员都只是关注于功能的实现,只 ...
- 西安活动 | 4月20日「拥抱开源,又见.NET :云时代 • 新契机」
云计算日渐兴起,成为提升企业效率和生产力的最终解决方案,而云时代也为软件开发模式带来了翻天覆地的变化.可以说 .NET Core就是这个时代催生的产物.自2016年 .NET Core 1.0 发布以 ...
- 重学 Java 设计模式:实战策略模式「模拟多种营销类型优惠券,折扣金额计算策略场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 文无第一,武无第二 不同方向但同样努力的人,都有自身的价值和亮 ...
- 为什么要用 C# 来作为您的首选编程语言
因为您可以用,并且也是您的最佳选择!之所以可用,是因为 C# 能够很好地在 Mac.Linux.Android 和 iOS 上运行(对了,还有 Windows):它可以在您最喜爱的编辑器上运行:它在一 ...
随机推荐
- Java——面向对象 this关键字
this,当成员变量和局部变量名字重名时,可以用关键字来区分. this 代表当前对象,就是所在函数所属的对象的引用. 即哪个调用了this所在的函数,this就代表哪个函数. 应用:1,构造方法间的 ...
- 【转载】解决nginx负载均衡的session共享问题
https://blog.csdn.net/u012081441/article/details/71787164 之前有写过ubuntu环境下搭建nginx环境,今天来谈一下nginx sessio ...
- Netty入门
一.NIO Netty框架底层是对NIO的高度封装,所以想要更好的学习Netty之前,应先了解下什么是NIO - NIO是non-blocking的简称,在jdk1.4 里提供的新api,他的他的特性 ...
- git merge 与 rebase
git merge git rebase merge V.S. rebase 参考材料 写在开始: 对merge和rebase的用法总有疑惑,好像两个都能完成"获取别的branch的comm ...
- Nginx日志配置及配置调试
防火墙内的内网服务器,因为网关传过来的remot_addr都一样,不得不对Nginx的日志格式做了配置 配置语法如下: log_format myformat '$http_x_forwarded ...
- 开始记录学习java的笔记
今天开始记录学习java的笔记,加油
- 发布 Rafy .NET Standard 版本 Nuget 包
去年年中,Rafy 框架的源码就已经支持了 Net Standard 2.0 版本.其开源代码也已经上传到 Github 中:https://github.com/zgynhqf/rafy/tree/ ...
- mysql 关于表与字段的增删改查操作
1.mysql 命令登陆 形式: mysql -u用户名 -p密码 mysql -uroot -proot 2.mysql 显示数据库 形式: show databases; 3.mysql 进入某一 ...
- 局部内部类访问它所在方法的局部变量时,要求该局部变量必须声明为final的原因
这是java的一条规则.那么为什么会有这条规则呢?要想弄懂这个问题,就需要弄懂局部内部类对象和局部变量的生命周期的谁更长的问题. 首先,看一段代码,以没有将变量声明为final的代码作为例子,代码如下 ...
- 浅谈Java多线程的同步问题 【转】
多线程的同步依靠的是对象锁机制,synchronized关键字的背后就是利用了封锁来实现对共享资源的互斥访问. 下面以一个简单的实例来进行对比分析.实例要完成的工作非常简单,就是创建10个线程,每个线 ...