min_25筛详解

扯淡

min_25筛是由min_25提出的求积性函数前缀和的亚线性算法,和一个叫“扩展埃氏筛”的东西有着微妙的关系。

至于是什么关系,我也不太清楚,反正有人说很像有人说就是一个东西(雾)

这段话并不是废话

约定

为了方便后面描述,这里写一些用到的约定和符号表示,以免产生恐惧

111被开除正整数籍 也就是说“前缀和”之类的都是从222开始,对答案所求的前缀和同样,最后手动加111

π(n)\pi(n)π(n)表示1∼n1 \sim n1n中质数个数的规模(其实问题不大,后面就懂了)

pip_ipi表示第iii个质数,单独的ppp均表示质数

primeprimeprime表示质数集合 minp(i)minp(i)minp(i)表示iii的最小质因子

pcp^cpc表示一个只含一个质因子的数

流程

首先所求的函数f(n)f(n)f(n)需要满足:

  1. 是个积性函数
  2. 在质数处的取值f(p)f(p)f(p)是一个关于ppp的多项式。我们把这个多项式拆成若干单项式分别计算在相加,这样就变成了"f(p)f(p)f(p)的值是一个关于ppp的单项式",我们记为f(p)=pkf(p)=p^kf(p)=pk
  3. f(pc)f(p^c)f(pc)的值可以快速计算

首先考虑计算这个东西

∑i=2n[i∈prime]ik\sum_{i=2}^n[i\in prime]i^ki=2n[iprime]ik

注意是iki^kik不是f(i)f(i)f(i),虽然这里还没有区别,但它们只是质数位置相等

首先既然叫扩展埃氏筛先回忆一下埃氏筛在干什么:开始写下所有正整数,然后从小到大,如果一个没被筛说明它是质数,用它筛掉后面的倍数

我们可以用这个思路计算上面的式子,先算出所有的和,再用质数筛掉所有合数项

g(n,j)g(n,j)g(n,j)表示用前jjj个质数筛了之后剩余项的和

g(n,j)=∑i=2n[i∈primeorminp(i)>pj]ikg(n,j)=\sum_{i=2}^n[i \in prime \quad or\quad minp(i)>p_j]i^kg(n,j)=i=2n[iprimeorminp(i)>pj]ik

和就是g(n,π(n))g(n,\pi(\sqrt{n}))g(n,π(n))

注意合数的最小质因子不会超过n\sqrt nn,所以如果pj2>np_j^2>npj2>ng(n,j)=g(n,j−1)g(n,j)=g(n,j-1)g(n,j)=g(n,j1)

对剩下情况考虑转移,即从g(n,j−1)g(n,j-1)g(n,j1)去掉被pjp_jpj删掉的项

g(n,j−1)=∑i=2n[i∈primeorminp(i)≥pj]g(n,j-1)=\sum_{i=2}^n[i\in prime \quad or \quad minp(i)\geq p_j]g(n,j1)=i=2n[iprimeorminp(i)pj]

如果脑子转不过来,可以强行算

[i∈primeorminp(i)≥pj][i\in prime \quad or \quad minp(i)\geq p_j][iprimeorminp(i)pj]且不满足[i∈primeorminp(i)>pj][i \in prime \quad or\quad minp(i)>p_j][iprimeorminp(i)>pj]

[i∈primeorminp(i)≥pj][i\in prime \quad or \quad minp(i)\geq p_j][iprimeorminp(i)pj][i∉prime]且[minp(i)≤pj][i \notin prime] 且 [minp(i)\leq p_j][i/prime][minp(i)pj]
综上
[i∉prime,minp(i)=pj][i \notin prime,minp(i)=p_j][i/prime,minp(i)=pj]

所以

g(n,j)=g(n,j−1)−∑i=2n[i∉prime,minp(i)=pj]ikg(n,j)=g(n,j-1)-\sum_{i=2}^n[i \notin prime,minp(i)=p_j]i^kg(n,j)=g(n,j1)i=2n[i/prime,minp(i)=pj]ik

可以提一个pjp_jpj出来,因为不能有质数,就把pjp_jpj去掉,刚好是111

g(n,j)=g(n,j−1)−pjk∑i=2⌊npj⌋[minp(i)≥pj]ikg(n,j)=g(n,j-1)-p_j^k\sum_{i=2}^{\lfloor\frac{n}{p_j}\rfloor}[minp(i)\geq p_j]i^kg(n,j)=g(n,j1)pjki=2pjn[minp(i)pj]ik

再次观察

g(n,j)=∑i=2n[i∈primeorminp(i)>pj]ikg(n,j)=\sum_{i=2}^n[i \in prime \quad or\quad minp(i)>p_j]i^kg(n,j)=i=2n[iprimeorminp(i)>pj]ik

发现可以拆成小于pjp_jpj的质数和大于等于pjp_jpj的所有数,第二个就是刚才的式子

g(n,j)=g(n,j−1)−pjk(g(⌊npj⌋,j−1)−∑i=1j−1pik)g(n,j)=g(n,j-1)-p_j^k(g(\lfloor\frac{n}{p_j}\rfloor,j-1)-\sum_{i=1}^{j-1}p_i^k)g(n,j)=g(n,j1)pjk(g(pjn,j1)i=1j1pik)

注意nnn由于都是一直整除,所以只会有O(n)O(\sqrt n)O(n)种取值,可以整除分块找出来强行离散化。在记录某个值vvv所在位置的时候,如果v>nv>\sqrt nv>n,我们另开一个数组存到⌊nv⌋\lfloor\frac{n}{v}\rfloorvn里面

然后后面只会用到最后一项,所以第二维可以滚掉

求答案时,设

S(n,j)=∑i=2n[minp(i)>pj]f(i)S(n,j)=\sum_{i=2}^n[minp(i)>p_j]f(i)S(n,j)=i=2n[minp(i)>pj]f(i)

分质数和合数分别计算

质数部分用ggg算出来的减去前jjj

g(n,π(n))−∑i=1jpikg(n,\pi(\sqrt n))-\sum_{i=1}^jp^k_ig(n,π(n))i=1jpik

合数部分枚举最小质因子和它的次数

∑k=j+1pk≤n∑e=1pke≤nf(pke)(S(⌊npke⌋,k)+[e>1])\sum_{k=j+1}^{p_k\leq\sqrt n}\sum_{e=1}^{p_k^e\leq n}f(p_k^e)(S(\lfloor\frac{n}{p_k^e}\rfloor,k)+[e>1])k=j+1pkne=1pkenf(pke)(S(pken,k)+[e>1])

[e>1][e>1][e>1]指如果指数大于111它本身就是合数,需要统计答案

两部分相加即可

总复杂度大概O(n23)O(n^{2\over3})O(n32)常数较小,大约2s2s2s1e101e101e10,3s3s3s1e111e111e11

模板题

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <cmath>#define MAXN 200005
using namespace std;
typedef long long ll;
const int MOD=1e9+7,INV6=(MOD+1)/6;
inline int add(const int& x,const int& y){return x+y>=MOD? x+y-MOD:x+y;}
inline int dec(const int& x,const int& y){return x<y? x-y+MOD:x-y;}
int np[MAXN],pl[MAXN],cnt;
inline void init(const int& N)
{np[1]=1;for (int i=2;i<=N;i++){if (!np[i]) pl[++cnt]=i;int x;for (int j=1;(x=i*pl[j])<=N;j++){np[x]=1;if (i%pl[j]==0) break;}}
}
ll val[MAXN];
int tot;
int g1[MAXN],g2[MAXN],sum1[MAXN],sum2[MAXN];
int key[MAXN],yek[MAXN];
ll n;
int m;
inline int getkey(const ll& v){return v<=m? key[v]:yek[n/v];}
int S(ll n,int j)
{if (pl[j]>=n) return 0;int k=getkey(n);int ans=dec(dec(g2[k],g1[k]),dec(sum2[j],sum1[j]));for (int k=j+1;k<=cnt&&(ll)pl[k]*pl[k]<=n;k++)for (ll e=1,pe=pl[k];pe<=n;e++,pe*=pl[k])ans=add(ans,pe%MOD*(pe%MOD-1)%MOD*(S(n/pe,k)+(e>1))%MOD);				return ans;
}
int main()
{scanf("%lld",&n);m=sqrt(n);init(m);for (ll l=1,r;l<=n;l=r+1){r=n/(n/l);val[++tot]=n/l;int t=val[tot]%MOD;g1[tot]=((ll)t*(t+1)/2)%MOD-1;g2[tot]=(ll)t*(t+1)%MOD*(2*t+1)%MOD*INV6%MOD-1;if (val[tot]<=m) key[val[tot]]=tot;else yek[n/(n/l)]=tot;}for (int j=1;j<=cnt;j++){for (int i=1;i<=tot&&(ll)pl[j]*pl[j]<=val[i];i++){int k=getkey(val[i]/pl[j]);g1[i]=dec(g1[i],(ll)pl[j]*dec(g1[k],sum1[j-1])%MOD);g2[i]=dec(g2[i],(ll)pl[j]*pl[j]%MOD*dec(g2[k],sum2[j-1])%MOD);}		sum1[j]=add(sum1[j-1],pl[j]),sum2[j]=add(sum2[j-1],(ll)pl[j]*pl[j]%MOD);}printf("%d\n",S(n,0)+1);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

asp.net core 自定义异常处理中间件

Intro在 asp.net core 中全局异常处理&#xff0c;有时候可能不能满足我们的需要&#xff0c;可能就需要自己自定义一个中间件处理了&#xff0c;最近遇到一个问题&#xff0c;有一些异常&#xff0c;不希望记录错误日志&#xff0c;目前主要是用户请求取消导致的 TaskCanceled…

CF786B Legacy 线段树优化建图

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 实现如下连边后跑最短路。 思路&#xff1a; 优化建图板子题&#xff0c;优化思路就是将区间分割成若干个线段树上的线段&#xff0c;与线段树分治有点类似&#xff0c;由于有点向区间也有区间向点的边&a…

【ZJOI2015】幻想乡 Wi-Fi 搭建计划【几何】【贪心】【dp】

传送门 题意&#xff1a;一个x∈(−∞,∞),y∈[0,R]x\in(-\infin,\infin),y\in[0,R]x∈(−∞,∞),y∈[0,R]的矩形中有nnn个点&#xff0c;矩形外有mmm个半径均为RRR的圆&#xff0c;有独立的代价cic_ici​。求覆盖最多的点所需的最小代价。 n,m≤100n,m\leq100n,m≤100 显然先…

.NET架构开发应知应会

.NET程序是基于.NET framework、.NET Core、Mono、UWP【.NET实现】开发和运行的 &#xff0c;定义以上【.NET实现】的标准规范称为.NET StandardL1&#xff1a;.NET Standard.NET标准是一组API集合&#xff0c;由上层三种【.NET实现】的Basic Class Library实现&#xff0c;更正…

几个冷门字符串算法的学习笔记(最小表示法,exKMP,Lyndon Word)

所有下标均从1开始 最小表示法 给定一个串&#xff0c;求字典序最小的循环同构。 我们把串复制一遍接在后面&#xff0c;然后求出[1,N][1,N][1,N]开始的长为NNN的子串中最小的 先设i1,j2i1,j2i1,j2 然后暴力找出iii和jjj往后匹配的第一个不同的位置&#xff0c;记为ikikik…

P6348 [PA2011]Journeys 线段树优化建图 区间连区间

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 每次连接[a,b][a,b][a,b]与[c,d][c,d][c,d]之间所有点&#xff0c;让后跑最短路。 思路&#xff1a; 比普通的优化建图能简单点&#xff0c;我们只需要加两个虚点之间边权为111&#xff0c;让后让某个点连…

.NET Core IdentityServer4实战 第Ⅴ章-单点登录

OiDc可以说是OAuth的改造版&#xff0c;在最初的OAuth中&#xff0c;我们需要先请求一下认证服务器获取下Access_token&#xff0c;然后根据Access_token去Get资源服务器, 况且OAuth1 和 2 完全不兼容&#xff0c;易用性差&#xff0c;而OIDC可以在登陆的时候就把信息返回给你&…

【CF594E】Cutting the Line 【贪心】【Lyndon Word】【扩展kmp】

传送门 题意&#xff1a;给一个字符串SSS和正整数kkk&#xff0c;将SSS分成最多kkk段&#xff0c;每段不变或翻转&#xff0c;使得最后的字典序最小。 ∣S∣≤5106|S|\leq5\times10^6∣S∣≤5106 发现不翻转可以看成拆成若干单字符分别翻转&#xff0c;所以先分析一下必须翻转…

一份好的工作总结才能帮你升职加薪

这里是Z哥的个人公众号每周五早8点 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「79」篇原创敬上最近有点忙&#xff0c;搬出之前攒的一篇文章来应急一下。一篇能助你挣更多钱的文章。好了&#xff0c;下面开始。我的读者们大部分是互联网行业的&#xff0c…

CF1385E Directing Edges 拓扑序

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个图和若干个边&#xff0c;有些是有向边&#xff0c;有些是无向边&#xff0c;让你给无向边定向&#xff0c;使得最终的图是DAGDAGDAG。 思路&#xff1a; 题目让构造DAGDAGDAG&#xff0c;比较容易…

【BZOJ3684】大朋友和多叉树【生成函数】【拉格朗日反演】【多项式幂函数】

传送门 题意&#xff1a;给定nnn和集合SSS&#xff0c;求含nnn个叶子结点、非叶子节点的儿子数在SSS内的树的个数 模 950009857(4532211)950009857(453\times2^{21}1)950009857(4532211)。结点无标号但儿子间有顺序。 n≤105n \leq 10^5n≤105 算是拉格朗日反演模版题了吧………

Codeforces Round #723 (Div. 2) D. Kill Anton 线段树 + 暴力

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个只有ANTOANTOANTO四个字母的字符串&#xff0c;你每次可以交换相邻两个&#xff0c;花费为111&#xff0c;让后让你打乱字符串&#xff0c;使得将打乱的字符串还原为原来的字符串的花费最小。 n≤1e…

腾讯开源软件镜像站上线

腾讯开源软件镜像站(Tencent Open Source Mirror Site)已于近日上线&#xff0c;其官方名称为「腾讯云软件源」&#xff0c;由腾讯云提供支持。官方表示搭建此开源镜像站的目的在于宣传自由软件的价值&#xff0c;提高自由软件社区文化氛围&#xff0c;推广自由软件在国内的应用…

【集训队作业2018】复读机【指数型生成函数】【单位根反演】【二项式定理】

传送门 单位根反演听着高级&#xff0c;其实没啥技术含量…… 本文是篇几乎没有证明的佛系讲解 单位根反演的式子长这样&#xff1a; 1n∑i0n−1ωnik[k∣n]\frac{1}{n}\sum_{i0}^{n-1}\omega_n^{ik}[k|n]n1​i0∑n−1​ωnik​[k∣n] 其实本质是IFFT 感觉懵的&#xff1f;…

ASP.NET Core on K8S学习初探(2)

“ [LOG] ASP.NET Core on K8S Starting...”在上一篇《单节点环境搭建》中&#xff0c;通过Docker for Windows在Windows开发机中搭建了一个单节点的K8S环境&#xff0c;接下来就是动人心弦的部署ASP.NET Core API到K8S了。但是&#xff0c;在部署之前&#xff0c;我还是把基本…

Educational Codeforces Round 96 E. String Reversa 线段树模拟序列交换

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 与上一篇题解大同小异&#xff0c;无非就是不需要枚举排列了。 // Problem: E. String Reversal // Contest: Codeforces - Educational Codeforces Round 96 (Rated for Div. 2) // URL:…

【LOJ6363】「地底蔷薇」【点双】【指数型生成函数】【扩展拉格朗日反演】【多项式幂函数】

传送门 题意&#xff1a;给定nnn和集合SSS,求出nnn个点的「所有极大点双连通分量的大小都在SSS 内」的不同简单无向连通图的个数 模 998244353998244353998244353。 n,∑i∈Si≤105n,\sum_{i\in S}i \leq10^5n,∑i∈S​i≤105 道理我都懂&#xff0c;可为啥我百度搜地灵殿ex终…

ASP.NET Core on K8S学习初探(1)

“ [LOG] ASP.NET Core on K8S Starting...”01—写在之前当近期的一个App上线后&#xff0c;发现目前的docker实例&#xff08;应用服务BFF中台服务工具服务&#xff09;已经越来越多了&#xff0c;而我司目前没有专业的运维人员&#xff0c;发现运维的成本逐渐开始上来&#…

AtCoder Regular Contest 120 C - Swaps 2 线段树模拟

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你两个序列a,ba,ba,b&#xff0c;每次可以执行一个操作&#xff1a;将a[i]a[i]a[i]与a[i1]a[i1]a[i1]交换&#xff0c;且让交换后的a[i]1,a[i1]−1a[i]1,a[i1]-1a[i]1,a[i1]−1&#xff0c;问将aaa变成bbb…

【BZOJ 4671】异或图 【斯特林反演】【线性基】【贝尔数复杂度】

传送门 题意&#xff1a;定义两个图的异或的边集为在两张图中恰出现一次的边。给sss张nnn个点的图的集合&#xff0c;求异或和为连通图的子集数。 s≤60,n≤10s \leq 60,n \leq 10s≤60,n≤10 设GiG_iGi​表示异或出iii个连通块的子集数&#xff0c;答案就是G1G_1G1​ GGG并不…