80分TLE#2#10求助
  • 板块P1621 集合
  • 楼主tyh0929
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/9/13 19:56
  • 上次更新2024/9/14 02:03:40
查看原帖
80分TLE#2#10求助
705729
tyh0929楼主2024/9/13 19:56
#include<bits/stdc++.h>
using namespace std;
int f[100010];
int s[100010];
bool v[100010];
vector<int>g;
int n,m,k;
int cnt;
int next(int x){
	if(f[x]==x){
		return x;
	}
	f[x]=next(f[x]);
	return f[x];
}
int make(int x,int y){
	int fx=next(x);
	int fy=next(y);
	if(fx!=fy){
		cnt--;
		if(s[fx]<s[fy]){
			f[fx]=fy;
			s[fy]+=s[fx];
		}else{
			f[fy]=fx;
			s[fx]+=s[fy];
		}
	}
}
int shai(){
	v[1]=1;
	for(int i=2;i<=m;i++){
		if(v[i]==0){
			g.push_back(i);
			for(int j=0;i*j<=m;j++){
				v[j*i]=1;
			}
		}
	}
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	for(int i=0;i<=100000;i++){
		f[i]=i;
		s[i]=1;
	}
	shai();
	cnt=m-n+1;
	for(int i=0;i<g.size();i++){
		if(g[i]<k){
			continue;
		}
		for(int j=n/g[i];j*g[i]<=m;j++){
			if(j*g[i]<n){
				continue;
			}
			for(int h=n/g[i];h*g[i]<=m;h++){
				if(h*g[i]<n||j==h){
					continue;
				}
				make(j*g[i],h*g[i]);
			}
		}
	}
	printf("%d",cnt);
	return 0;
}

2024/9/13 19:56
加载中...