min_25 筛是由 min_25 大佬使用后普遍推广的一种新型算法,这个算法能在 \(O({n^{3\over 4}\over log~ n})\) 的复杂度内解决所有的积性函数前缀和求解问题(个人感觉套上素数定理证明的复杂度的话应该要把下面的 log 改成 ln ,不过也差不多啦~)

其实 min_25 筛的入门TXC 大佬的 blog 已经写的非常棒了QVQ

所以搬博客的话鉴于博主太懒了就不干了...直接帮 TXC 大佬安利博客完事

这篇博客主要的目的是证明网上大多没有的 min_25 筛的复杂度

所以你首先得学会 min_25 筛...

前置芝士

Min_25 筛

素数定理

proof

首先我们知道 min_25 筛做了两件事:

  1. 筛出一个所求函数的质数前缀和

  2. 递归/循环 得到所求函数的前缀和

对于第一个部分和第二个部分我们发现都有一个枚举质数的过程,那么我们需要先知道 n 范围内的质数个数

这就需要素数定理了,素数定理指:在 n 以内的素数个数是 \(O({n\over ln~ n})\) 的(下面为了方便起见就用 \(log ~n\) 代替这里的 \(ln~n\) 了 )

至于具体证明就不是本博客的任务了 QVQ

我们可以根据这一点结合埃氏筛法的复杂度得知:

我们在进行 min_25 中处理的 \(2\sqrt n\) 个数的函数前缀和时,一个数 x 被筛到过 \(O({\sqrt x\over log~ \sqrt x})\) 次

并且,无论是筛出所求函数关于 x 的质数前缀和还是全部的前缀和,都是这个次数(如果你写过循环代替递归版的 min_25 的话,就更加清楚这是为什么了)

这里可以贴出我写的一种 min_25 筛的版本(以筛 mu 的前缀和为例):

inline int ID(Rg int x){
return x<=sq?id1[x]:id2[n/x];
}
inline int calc(Rg int k,int j){
return w[k]>=p[j]?h[k]-j+1:0;
}
inline void Min_25(ll n){
sq=sqrt(n),m=0; int tot=0;
for(tot=1;1ll*p[tot]*p[tot]<=n;++tot); for(Rg ll l=1;l<=n;l=w[m]+1){
w[++m]=n/(n/l),
h[m]=w[m]-1,Mu[m]=0,
//这里的 h 指质数个数的前缀和 , Mu 指莫比乌斯函数的前缀和
if(w[m]<=sq) id1[w[m]]=m;
else id2[w[m]]=m;
}
for(Rg int j=1;j<=tot;++j){
for(Rg int i=m;i&&1ll*p[j]*p[j]<=w[i];--i)
h[i]-=h[ID(w[i]/p[j])]-j+1;
}
for(Rg int j=tot;j;--j){
for(Rg int i=m,k;i&&1ll*p[j]*p[j]<=w[i];--i)
Mu[i]-=Mu[k]-calc(k,j+1);
}
for(Rg int i=m;i;--i) Mu[i]-=h[i];
}

不压行真的好难受嘤嘤嘤...

我们发现上面筛出 mu 前缀和的时候两个处理部分都是用了极其类似的双重循环,(并且保证了答案是对的...),那么也就可以证明上面的说法了

所以我们就可以列出复杂度的式子:

\[O(Min\_25)=\sum_{x=1} ^{\sqrt n} O({\sqrt x\over log~ \sqrt x}) + \sum_{x=1} ^{\sqrt n} O({\sqrt {n\over x}\over log~ \sqrt {n\over x}})
\]

主定理一波就是:

\[\sum_{x=1} ^{\sqrt n} O({\sqrt {n\over x}\over log~ \sqrt {n\over x}})
\]

然后开始积分:

\[O\Big( \int_1^{\sqrt n} {\sqrt {n\over x}dx\over log~ \sqrt {n\over x}} \Big)
\]

然后正常做法就难搞了,那么我们假一点,反正求的是大致复杂度,那么我们让下面的表达式直接变为 \(log~ n\)(这里把常数直接略去) 这样我们的任务就只剩下求上面表达式的积分了

至于这样为什么可行? 我们发现下面的表达式中有一个 log ,虽然我们让下面的表达式都变大了,但在 log 后,不过是少个常数的问题

如果这里有疑问的话,我们也可以把下面的表达式改成最小的 \(log~\sqrt{n}={1\over2}log~\sqrt{n}\),然后我们再把 \(1\over 2\) 忽略,这样的结果和上面是一样的...

于是乎原来的式子就变成了:

\[O\Big( {\int_1^{\sqrt n} \sqrt {n\over x}dx\over log~ n} \Big)
\]

\[O\Big( {\sqrt n \int_1^{\sqrt n} x^{-{1\over2}} dx\over\ log~ n} \Big)
\]

上面的那个积分已经是个多项式了:

\[O\Big( {\sqrt n ·( 2{\sqrt n}^{1\over2} )\over\ log~ n} \Big)
\]

\[O\Big( { n^{1\over 2} · n^{1\over 4} \over\ log~ n} \Big)
\]

\[O\Big( {n^{3\over 4} \over\ log~ n} \Big)
\]

这样整个 min_25 筛的复杂度就证明完毕啦~

关于 min_25 筛的入门以及复杂度证明的更多相关文章

  1. 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 ...

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

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

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

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

  4. [复习]莫比乌斯反演,杜教筛,min_25筛

    [复习]莫比乌斯反演,杜教筛,min_25筛 莫比乌斯反演 做题的时候的常用形式: \[\begin{aligned}g(n)&=\sum_{n|d}f(d)\\f(n)&=\sum_ ...

  5. Min_25 筛

    Min_25 筛 yyb好神仙啊 干什么用的 可以在\(O(\frac{n^{\frac 34}}{\log n})\)的时间内求积性函数\(f(x)\)的前缀和. 别问我为什么是这个复杂度 要求\( ...

  6. 关于min_25筛的一些理解

    关于min_25筛的一些理解 如果想看如何筛个普通积性函数啥的,就别往下看了,下面没有的(QwQ). 下文中,所有的\(p\)都代表质数,\(P\)代表质数集合. 注意下文中定义的最小/最大质因子都是 ...

  7. LOJ #6202. 叶氏筛法(min_25 筛)

    题意 求 \([L, R]\) 之间的素数之和 . \(L≤10^{10},2×10^{10} \le R \le 10^{11}\) 题解 一个有点裸的 min_25筛 ? 现在我只会筛素数的前缀和 ...

  8. 【LOJ#572】Misaka Network 与求和(莫比乌斯反演,杜教筛,min_25筛)

    [LOJ#572]Misaka Network 与求和(莫比乌斯反演,杜教筛,min_25筛) 题面 LOJ \[ans=\sum_{i=1}^n\sum_{j=1}^n f(gcd(i,j))^k\ ...

  9. LOJ572. 「LibreOJ Round #11」Misaka Network 与求和 [莫比乌斯反演,杜教筛,min_25筛]

    传送门 思路 (以下令\(F(n)=f(n)^k\)) 首先肯定要莫比乌斯反演,那么可以推出: \[ ans=\sum_{T=1}^n \lfloor\frac n T\rfloor^2\sum_{d ...

随机推荐

  1. Linux内存管理 (22)内存检测技术(slub_debug/kmemleak/kasan)

    专题:Linux内存管理专题 关键词:slub_debug.kmemleak.kasan.oob.Redzone.Padding. Linux常见的内存访问错误有: 越界访问(out of bound ...

  2. Java HttpClient4.5.2发送post请求示例

    public static Map<String, Object> invokeCapp(String URL, Map paramMap) throws Exception { Map ...

  3. AOP从静态代理到动态代理 Emit实现

    [前言] AOP为Aspect Oriented Programming的缩写,意思是面向切面编程的技术. 何为切面? 一个和业务没有任何耦合相关的代码段,诸如:调用日志,发送邮件,甚至路由分发.一切 ...

  4. Java 如何存取MySQL datetime类型

    1 在java中只有Date类型,这样数据存储到MySQL会出现问题,前台提交的数据,比如2018-03-20 17:30:59,后台用Date接受的时候,由于Date只精确到天,所以默认接收时间为2 ...

  5. 转 - mybatis中${}、 #{}区别及应用场景

    转与 https://www.jianshu.com/p/bbeff97d41eb 动态sql是mybatis的主要特性之一.在mapper中定义的参数传到xml中之后,在查询之前mybatis会对其 ...

  6. EntityManagerFactory 是多线程的 将其变成一个单线程(使用静态方法)提交效率

    由于EntityManagerFactory 是一个线程安全的对象(即多个线程访问同一个EntityManagerFactory 对象不会有线程安全问题),并且EntityManagerFactory ...

  7. 2.6 datetime 模块

    目录 2.6.1  常用类 2.6.1.1 datetime.date 2.6.1.2 datetime.time 2.6.1.3 datetime.datetime 2.6.1.4 datetime ...

  8. C++ 动态链接库 DLL 的一些笔记

    DLL 文件源代码: // test.h #ifdef TEST_EXPORTS #define TEST_API __declspec(dllexport) #endif class TEST_AP ...

  9. 「CF1154F」Shovels Shop【背包DP】

    题目链接 [洛谷传送门] 题解 非常简单的背包. \(f[i]\)表示购买\(i\)个物品所需要最少的花费. 不考虑免费的限制条件,那么一定是选择前\(k\)个双鞋子. 那么加入免费的条件,那么还是要 ...

  10. 深入理解JVM(2)——运行时数据区

    1.运行时数据区 1.1.程序计数器 记录当前线程正在执行的字节码指令的地址,如果正在执行的是 Native 方法,这个计数器值则为空. 1.2.虚拟机栈 每个 Java 方法在执行的同时会创建一个栈 ...