结队
结队
题目描述
题目思路
注意:题中所说只要有大于的质因子就可以结合在一起。
所以不妨在埃筛的过程中直接用并查集,最后再统计即可(代码有注释)。
CODE
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn = 500000+32;
ll int_maxn=1e9;
ll ll_maxn=1e18;
inline ll read_int(){
ll a=0,f=0,g=getchar();
while(g<'0'||g>'9'){if(g=='-') f=1;g=getchar();}
while('0'<=g&&g<='9') a=a*10+g-'0',g=getchar();
return f ? -a : a;
}
inline void write(ll s,bool f){
ll top=0,a[40];
if(s<0) s=-s,putchar('-');
while(s) a[++top]=s%10,s/=10;
if(top==0) a[++top]=0;
while(top) putchar(a[top]+'0'),top--;
if(f) putchar('\n');
}
bool no[maxn];
int prime[maxn],top;
int bcj[maxn];
inline int find(int a){return bcj[a]==a ? a : bcj[a]=find(bcj[a]);}
bool jl[maxn];
int A,B,p;
inline void read(){
A=read_int(),B=read_int(),p=read_int();
for(int i=1;i<=B;i++) bcj[i]=i;//并查集初始化
for(int i=2;i<=B;i++){
if(!no[i]) prime[++top]=i;
int base=0;
if(no[i]==0) for(int e=1;e<=maxn&&i*e<=B;e++){
int lin=e*i;
if(!base&&lin>=A) base=find(lin);
no[lin]=1;
if(i>=p) bcj[find(lin)]=base;
//取第一个满足条件的数所在集合作为合并后的集合
}
}//埃筛
int ans=0;
for(int i=A;i<=B;i++){
int F=find(i);
if(!jl[F]) ans++;
jl[F]=1;//统计
}
write(ans,1);
}
int main (){
freopen("merge.in","r",stdin);
freopen("merge.out","w",stdout);
read();
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】