首页 > 其他分享 >Min_25 筛学习笔记

Min_25 筛学习笔记

时间:2024-04-15 15:59:33浏览次数:19  
标签:mathbb 25 frac Min qquad 质数 笔记 300010 lfloor

My Blogs

杜教筛是一种能在 \(\mathcal O(n^{\frac 2 3})\) 的时间复杂度内求积性函数前缀和的筛法。虽然复杂度比较优秀,但是被筛的积性函数需要满足特殊性质。

Min_25 筛由 Min_25 发明,相对更通用,其时间复杂度为 \(\mathcal O(\frac{n^{\frac 3 4}}{\log n})\)。

首先构造一个完全积性函数 \(f'(x)\) 满足其在质数处和 \(f(x)\) 取值相同,其余位置任意。下设 \(\mathbb{P}\) 为质数集合,\(p_j\) 为第 \(j\) 个质数。

设 \(g(n,j)\) 表示 \(\sum_{i\leq n}f'(i)[i\in \mathbb{P}\lor\min_{x|i,x\in\mathbb{P}}>p_j]\)。一开始 \(g(n,0)\) 就是 \(\sum_{i\leq n}f'(i)\),考虑 \(j\) 变大了之后会减少那些数的贡献:

若 \(p_j^2>n\),则显然 \(g(n,j)=g(n,j-1)\)。

否则,有贡献的是最小质因子恰为 \(p_j\) 的数。可以考虑整体除掉一个 \(p_j\),因为满足完全积性,所以所有应当删去的树贡献就全部少乘了 \(f'(p_j)\)。

这样就变成了 \(g(\lfloor\frac n {p_j}\rfloor,j-1)\)。但是这样回多算 \([1,\lfloor\frac n {p_j}\rfloor]\) 内质数的贡献,需要再减去。

转移方程为:

\[g(n,j)=\begin{cases} g(n,j-1)\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad p_j^2>n\\ g(n,j-1)-f'(p_j)(g(\lfloor\frac n {p_j}\rfloor,j-1)-\sum_{j\leq \lfloor\frac n {p_j}\rfloor,j\in\mathbb{P}}f'(j))\;\;\;\;\;\;p_j^2\leq n \end{cases} \]

这样最后得到的 \(g(n,\lvert\mathbb P\rvert)\) 就是 \(n\) 以内所有质数处的函数值。经过上述操作可以把错误的函数值舍去,最后剩下的是对的函数值。

预处理 \(g\) 之后设 \(S(n,j)\) 表示 \(\sum_{i\leq n}f(i)(\min_{p|i,p\in \mathbb P}p>p_j)\)。

首先对于 \(i\) 是质数的部分,答案就是 \(g(n,\lvert\mathbb P\rvert)\),这样会多算 \(<j\) 的质数,再减去 \(\sum_{i\in\mathbb P,i<j} f(i)\)。

否则枚举其最小的因子 \(p\) 和次幂 \(e\),则有:

\[S(n,j)=g(n,\lvert\mathbb P\rvert)-\sum_{i\in\mathbb P,i<j} f(i)+\sum_{i>j}\sum_{e\geq 1}^{p_i^e\leq n}f(p_i^e)(S(\lfloor\frac n {p_i^e}\rfloor,i)+[e>1]) \]

加入 \([e>1]\) 是因为质数处的点值已经被计算过,但是 \(p^k(k>1)\) 的点值还没有被计算。

边界条件是 \(S(n,j)=0(p_j>n)\)。但是这样预处理 \(g\) 的复杂度达到了 \(\mathcal O(n\log n)\)。

注意到 \(g(i,j)\) 有用当且仅当存在 \(k\) 使得 \(\lfloor\frac n k\rfloor=i\),所以有用的点只有 \(\mathcal O(\sqrt n)\) 个。总复杂度是 \(\mathcal O(\mathcal O(\frac{n^{\frac 3 4}}{\log n}))\) 不会证

	ll n,w[300010],g1[300010],g2[300010],sum1[300010],sum2[300010],pr[300010];
	int N,m,cnt,id1[300010],id2[300010],iv6;
	bool v[300010];
	inline void sieve()
	{
		for(int i=2;i<=N;++i)
		{
			if(!v[i])pr[++cnt]=i;
			for(int j=1;j<=cnt&&pr[j]*i<=N;++j)
			{v[pr[j]*i]=1;if(i%pr[j]==0)break;}
		}
		for(int i=1;i<=cnt;++i)
		{
			sum1[i]=Cadd(sum1[i-1],pr[i]);
			sum2[i]=(sum2[i-1]+1ll*pr[i]*pr[i])%MOD;
		}
	}
	inline int f1(ll x){x%=MOD;return x*(x+1)/2%MOD;}
	inline int f2(ll x){x%=MOD;return x*(x+1)%MOD*(2*x+1)%MOD*iv6%MOD;}
	inline int getid(ll x){return x<=N?id1[x]:id2[n/x];}
	ll S(ll x,int j)
	{
		if(pr[j]>x)return 0;
		ll ans=Cdel(Cdel(g2[getid(x)],g1[getid(x)]),Cdel(sum2[j],sum1[j]));
		for(int i=j+1;i<=cnt&&pr[i]*pr[j]<=x;++i)
		{
			for(ll e=1,sp=pr[i];sp<=x;sp*=pr[i],++e)
			ans=(ans+sp%MOD*(sp%MOD-1)%MOD*(S(x/sp,i)+(e>1)))%MOD;
		}
		return ans;
	}
	inline void mian()
	{
		read(n),N=sqrt(n),sieve(),iv6=power(6,MOD-2);
		for(ll l=1,r;l<=n;l=r+1)
		{
			r=n/(n/l),w[++m]=n/l;
			g1[m]=f1(w[m])-1,g2[m]=f2(w[m])-1;
			if(w[m]<=N)id1[w[m]]=m;else id2[n/w[m]]=m;
		}
		for(int i=1;i<=cnt;++i)
		{
			for(int j=1;j<=m&&pr[i]*pr[i]<=w[j];++j)
			{
				g1[j]=((g1[j]-1ll*pr[i]*(g1[getid(w[j]/pr[i])]-sum1[i-1]))%MOD+MOD)%MOD;
				g2[j]=((g2[j]-1ll*pr[i]*pr[i]%MOD*(g2[getid(w[j]/pr[i])]-sum2[i-1]))%MOD+MOD)%MOD;
			}
		}
		cout<<S(n,0)+1;
	}

标签:mathbb,25,frac,Min,qquad,质数,笔记,300010,lfloor
From: https://www.cnblogs.com/WrongAnswer90/p/18136096

相关文章

  • ROS笔记[1]-搭建Gazebo仿真环境
    摘要在阿里无影云电脑Ubuntu20.04上搭建ROS1-Noetic环境及Gazebo环境;搭建XTDrone仿真环境.关键信息系统:Ubuntu20.04ROS1版本:NoeticGazebo版本:9原理简介阿里无影云电脑[https://www.aliyun.com/product/ecs][https://wuying.aliyun.com/]无影云电脑(WUYINGWorkspac......
  • MindSpore运行报错RuntimeError: Unsupported device target GPU解决方案
    问题背景在运行MindSpore程序时,设置device_target为GPU,结果运行时报错:RuntimeError:UnsupporteddevicetargetGPU.Thisprocessonlysupportsoneofthe['CPU'].PleasecheckwhethertheGPUenvironmentisinstalledandconfiguredcorrectly,andcheckwhethercu......
  • 「二分图」笔记
    二分图同时满足不存在奇数环和染色法不矛盾。二分图的判定:染色法#include<bits/stdc++.h>usingnamespacestd;constintN=1e3+10,M=2e6+10;struct{ intto,next;}e[M];inttop,h[N],color[N],n,m;voidadd(intx,inty){ e[++top]={y,h[x]};......
  • 「树链剖分」 学习笔记
    一,树链剖分的思想与概述正如其名,树链剖分用于将树剖分成若干条链的形式,以维护树上路径的信息,其中剖分出的链有多种形式,最常见的是重链,还有长链或更多其它的链。其中剖分出的链为重链时,就引出了下文的主角「重链剖分」。重链剖分能保证划分出的每条重链上的节点DFS序连续,因此......
  • day06_我的Java学习笔记 (综合应用专题课)
    专题课(综合案例)案例一:买飞机票案例二:找素数上述老师代码有点问题,即:j<i/2;应为j<=i/2;见如下判断:其实出问题的点,只会在i=4时,因为当i=4时,j<i/2:不成立,直接跳过该循环,执行步骤3的操作了。(当范围不是101-200,而是包含了4,则会出现上述的现象,因4不满......
  • day04_我的Java学习笔记 (数组的静态初始化、数组的动态初始化,debug调试等)
    1.数组1.1数组的定义那python怎么定义数组的呢?Java:String[]names={"zhangsan","lisi","wangwu"}Python:names=["zhangsan","lisi","wangwu"]在python中,列表可以存储不同类型的数据,而在Java中,数组只能存储相同类型的数据。1......
  • day02_我的Java学习笔记 (类型转换、+做连接符、变量自增自减运算、三元运算符、键盘
    Java语言基础知识1.类型转换1.1自动类型转换1.2表达式的自动类型转换1.3强制类型转换这里得出的结果为啥是-36呢???后面高级篇再细讲。2.运算符2.1算数运算符2.1.1基本算数运算符2.1.2案例:数值拆分2.2+符号做连接符【思考1】:a+'a'为啥......
  • day01-02_我的Java学习笔记 (IDEA的安装、配置及使用、IDEA常用快捷键、IEDA创建空工
    1.IDEA的安装及配置1.1IDEA的安装具体操作,详见《04、IDEA安装详解.pdf》1.2IDEA主题配置、字体配置1.3IDEA常用快捷键1.4IDEA修改快捷键在IDEA工具中,Ctrl+空格的快捷键,可以帮助我们补全代码,但是这个快捷键和Windows中的输入法切换快捷键冲突,需要修改IDEA中......
  • day01-03_我的Java学习笔记(Java基础语法--注释、字面量、变量、二进制、ASCII编码、
    1.Java基础语法1.1注释1.2字面量(Python中叫数据类型)1.3变量1.3.1变量的定义及使用1.3.2变量使用注意事项1.4数据的存储形式:二进制字节、字、bit、byte的关系:字word字节byte位bit,来自英文bit,音译为“比特”,表示二进制位。字长是指字的......
  • 《线性代数的本质》笔记(04-附注1-05)
    04-矩阵乘法与线性变换复合的联系问:如何描述连续两个线性变换?答:先左乘一个矩阵,再左乘一个。如果我们用一个矩阵来描述这个复合过程,那么这个矩阵应该等于两个矩阵的乘积,这就是矩阵的乘法。如何理解上图:把右侧矩阵M2看作看作第一次变换后的\(\hat{i}\)向量和\(\hat{j}\)向量,......