比赛 2025暑期集训第2场 评测结果 AAAAAAAATT
题目名称 整数合并 最终得分 80
用户昵称 pcx 运行时间 2.871 s
代码语言 C++ 内存使用 3.82 MiB
提交时间 2025-06-29 16:09:58
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int f[N],a,b,p;
bool v[N],vis[N];
void init(int n,int m){
    for(int i=n;i<=m;i++) f[i]=i;
    return;
}
int get(int x){
    if(f[x]==x) return x;
    else return f[x]=get(f[x]);
}
void merge(int x,int y){
    int fx=get(x),fy=get(y);
    if(fx!=fy) f[fy]=fx;
    return;
}
void prime(int n){
    for(int i=2;i<=n;++i) v[i]=1;
    for(int i=2;i<=n;++i){
        if(!v[i])continue;
        for(int j=i;j<=n/i;++j){
            v[i*j]=0;
        }
    }
}
int main(){
    freopen("setb.in","r",stdin);
    freopen("setb.out","w",stdout);
    prime(50000);
    cin>>a>>b>>p;
    init(a,b);
    int ans=0;if(p==1)p++;
    for(int i=p;i<=b;i++){
        if(v[i]){
            int first=0;
            for(int j=a;j<=b;j++){
                if(j%i==0){
                    if(first==0){
                        first=j;
                    }else{
                        f[get(j)]=get(first);
                    }
                }
            }
        }
    }
    for(int i=a;i<=b;i++){
        int x=get(i);
        if(!vis[x]){
            vis[x]=1;
            ans++;
        }
    }
    cout<<ans;
    return 0;
}