40求调
  • 板块P1621 集合
  • 楼主zdnzkzl
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/3/9 19:24
  • 上次更新2024/3/9 21:08:45
查看原帖
40求调
1098507
zdnzkzl楼主2024/3/9 19:24
#include <iostream>
using namespace std;
int f[10000005];
int prime[1000005];
int v[1000005];
int num;
int a,b,p;

void ol(int n){
	for(int i=2;i<=n;++i){
		if(v[i]==0) prime[++num]=i;
		for(int j=1;j<=num&&i*prime[j]<=n;++i){
			v[i*prime[j]]=1;
			if(i%prime[j]==0) break;
		}
	}
}
inline int find(int x){
	if(f[x]==x) return x;
	return f[x]=find(f[x]);
}
inline bool finnd(int x,int y){
	for(int i=1;i<=num;++i){
		if(x%prime[i]==0&&y%prime[i]==0&&prime[i]>=p){
			return 1;
		}
	}
	return 0;
}
int main(){
	cin>>a>>b>>p;
	ol(b);
	for(int i=a;i<=b;++i) f[i]=i;
	int ans=0;
	for(int i=a;i<b;++i){
		for(int j=i+1;j<=b;++j){
			if(find(f[i])==find(f[j])) continue;
			if(finnd(i,j)==1){
				f[find(i)]=find(j);
			}
		}
	}
	for(int i=a;i<=b;++i){
		if(f[i]==i) ans++;
	}
	cout<<ans;
	return 0;
}
2024/3/9 19:24
加载中...