min_25筛(Unfinished)

SX%N考了好几道min_25,但我还是没有学,因为听说是小概率考点,现在学也没时间了,考完再说吧。但被题解忽悠着订了今天的题,事后发现虽然他只字未提但这就是min_25板。

pN,pP(N/p+N/p2+...)(N1011)

题解:
拆成 N/p(N/p2+N/p3+...) 两部分算,后者只需要算 pN,不在话下。
N/p 用整除分块算,由于 N/pO(n) 种取值,我们考虑对每一个块的 r,用 dp 求 [1,r] 的质数个数。
f[i][n] 表示只考虑i 个质数的情况下,[1,n] 中有几个“质数”。显然有:

f[i][n]=f[i1][n](f[i1][n/p](i1))

其中 i1n 的质数个数,为 O(n) 的,n 只需枚举整除分块右端,一共 O(n) 个,空间复杂度爆炸。考虑如果外层循环枚举 p,每次的 n 只需要枚举满足 p2n 的,可以预处理出所有右端点,则每次要取的只是一段均摊 O(n) 的后缀。为什么呢?显然这样其实等价于交换循环顺序(即先枚举右端点 r,再枚举 rp),这样显然就是 O(1+2+3+...+n+...+n2+n),算出来 n=1011 时大概是 4e8,实际常数较小,跑得很快。不过注意必须用前一种循环顺序,因为这样我们可以用类似滚动数组的方式转移,而不需要存两维 MLE。

复制
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=800000;
ll n,ans,tot,R[N],f[N],id1[N],id2[N];
int qn,n_p,p[N];
bool v[N];
inline int gid(ll x){return x<=qn?id1[x]:id2[n/x];}
int main(){
cin>>n,qn=sqrt(n);
v[1]=1;
for(int i=1;i<=qn;i++){
if(!v[i])p[++n_p]=i;
for(int j=1;j<=n_p&&p[j]<=qn/i;j++){
v[i*p[j]]=1;
if(i%p[j]==0)break;
}
}
for(int i=1;i<=n_p;i++)
for(ll j=1ll*p[i]*p[i];j<=n;j*=p[i])
ans+=n/j;
for(ll l=1,r;l<=n;l=r+1){
R[++tot]=r=n/(n/l);
if(r<=qn)id1[r]=tot;
else id2[n/r]=tot;
}
for(int i=1;i<=tot;i++)f[i]=R[i]-1;
for(int i=1;i<=n_p&&p[i]<=n/p[i];i++)
for(int j=tot;j&&1ll*p[i]*p[i]<=R[j];j--){
f[j]-=f[gid(R[j]/p[i])]-i+1;
}
for(int i=1;i<=tot;i++)ans+=(f[i]-f[i-1])*(n/R[i]);
cout<<ans;
}
posted @   pengyule  阅读(18)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示