比赛 20190522数学 评测结果 AAAAAAAAAA
题目名称 整数合并 最终得分 100
用户昵称 氢氦 运行时间 0.029 s
代码语言 C++ 内存使用 14.14 MiB
提交时间 2019-05-23 14:13:30
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn (int)1e5+5

using namespace std;

int n,m,p;
int fa[maxn];
bool is_prime[maxn];

int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}

bool judge(int x,int y){return find(x)==find(y)?true:false;}

void merge(int x,int y){fa[find(x)]=find(y);}

int main()
{
	freopen("setb.in","r",stdin);
	freopen("setb.out","w",stdout);
    scanf("%d%d%d",&n,&m,&p);
    int ans=m-n+1;
    for(int i=n;i<=m;i++)fa[i]=i;
    is_prime[1]=true;
    for(int i=2;i<=m;i++){
        if(!is_prime[i]){
            if(i>=p){
                for(int j=i+i;j<=m;j+=i){
                    is_prime[j]=true;
                    if(j-i>=n&&!judge(j,j-i)){
                        merge(j,j-i);
                        ans--;
                    }
                }
            }
            else{
                for(int j=i+i;j<=m;j+=i){
                    is_prime[j]=true;
                }
            }
        }
    }
    printf("%d\n",ans);
    return 0;
}