Min_25 筛入门
Min_25 筛
Min_25 筛
其实质为动态规划
只能用于求积性函数前缀和。
要求积性函数
符号约定:
-
是 的最小质因子, -
为第 小的质数,约定 -
,注意从 开始。 -
几个性质:
然后我们考虑DP转移。
可以枚举
一个说明:对于
递推式的几个性质:
-
前半部分枚举只需要所有
-
后半部分在整个DP过程中只需要用到
个,也就是 所提供的 以及所有 的注意到递归的时候都保证了
,所以传进去的 至多是 。注意边界在这里考虑采用特殊处理
,在线性筛的时候直接算即可
根据递推式暴力计算的时间复杂度为
所以一般直接暴力算是可过的
问题规约为求
考虑一个东西:
-
是关于 的较低次数多项式,所以可以写为 。所以我们只需要对每个指数都求一遍即可。也就是跑"次数"次
我们考虑对于每个
我们考虑设
这东西相当于埃氏筛法在筛除第
个质数之后尚未被筛的所有数的 之和
根据
所以我们只需要算到
这样拆分系数的关键是
所以我们考虑埃氏筛法的过程DP
-
可以用等幂和公式直接计算,注意不包含零 -
考虑
的部分,没有影响,直接继承否则考虑直接继承之后会少掉什么。
也就是
为 的所有值。考虑容斥。所有
的根据完全积性函数可以被表示为 ,意义是确保了原本 的数其 全部大于 ,然后钦定加入一个 进去。但是在这里会发现质数没有考虑到,且被删掉了。所以我们加回来,恰好这个答案是
。所以有:
并且根据数论分块的知识,
总复杂度可以估计为:
常数很小。
只能说 NB!
例题:
梦中的数论
求解:
考虑化简:
我们知道
所以问题在于求解约数个数的平方和。
带入Min_25筛模型,有
进而可以得到
主要是提供一份模版。
注意这玩意甚至不需要记忆化。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define N 1050500
const int mod=998244353;
unordered_map<int,int>fp;
int v[N],tot,p[N],sp[N],n,m;
int f(int p,int c){
return (c+1)*(c+1)%mod;
}
int calcf(int n,int k){
int res=fp[n]-sp[k-1];
for(int i=k;i<=tot;++i){
if(p[i]*p[i]>n)break;
int now=p[i];
for(int c=1;now*p[i]<=n;++c,now*=p[i]){
res+=f(p[i],c)*calcf(n/now,i+1)%mod+f(p[i],c+1);res%=mod;
}
}
return res;
}
/*
这个题里面f(p)=4,因为是约数个数的平方
*/
void init(int n){//sqrt n
vector<int>ud;
for(int l=1,r;l<=n;l=r+1){
r=min(n/(n/l),n);
ud.push_back(n/l);
}
//这玩意可以直接滚动数组,每次找最前面的
/*从大到小存储,每次直接算,如果不必再算就pop*/
int t=sqrt(n)+1;
for(auto x:ud)fp[x]=(x-1)%mod;
for(int i=2;i<=t;++i){
if(!v[i]){
v[i]=1;p[++tot]=i;sp[tot]=sp[tot-1]+1,sp[tot]%=mod;
for(int j=i;j<=t;j+=i)v[j]=1;
if(ud.empty())continue;
for(auto x:ud){
if(i*i<=x)fp[x]-=fp[x/i]-sp[tot-1],fp[x]%=mod;
}
while(!ud.empty()&&i*i>ud[ud.size()-1]){
ud.pop_back();
}
}
}
for(int i=1;i<=tot;i++)sp[i]*=4,sp[i]%=mod;/*算上系数*/
for(int l=1,r;l<=n;l=r+1){
r=min(n/(n/l),n);fp[n/l]*=4,fp[n/l]%=mod;
}
}
signed main(){
cin>>n;
init(n);
int res=calcf(n,1)+1;
for(int l=1,r;l<=n;l=r+1){
r=min(n/(n/l),n);
res-=(r-l+1)*(n/l)%mod;
}
res%=mod;
res*=((mod+1)>>1);
res=(res%mod+mod)%mod;
cout<<res<<"\n";
}
只能说这个DP妙啊。
一个优化常数的技巧,在
将 unordered_map
的常数开销
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!