90分,第2个点TLE,大佬们帮帮我吧!
  • 板块P1621 集合
  • 楼主STUDENT00
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/10/6 11:34
  • 上次更新2023/10/27 08:33:05
查看原帖
90分,第2个点TLE,大佬们帮帮我吧!
658786
STUDENT00楼主2022/10/6 11:34

一切卡常办法都用上了,但是第2个点仍然TLE……

代码如下:

#include<bits/stdc++.h>
using namespace std;
int a,b,p,fa[100010],ans; 
bool noPM[100010];
int find(int x){
	if(fa[x]==x) return x;
	return fa[x]=find(fa[x]);
}
void unnion(int x,int y){
	x=find(x);
	y=find(y);
	if(x!=y) fa[x]=y;
}
int main(){
	noPM[1]=1;
	for(register int i=2;i*i<=100000;i++){
		if(!noPM[i]){
			for(register int j=2*i;j<=100000;j+=i) noPM[j]=1;
		}
	}
	scanf("%d%d%d",&a,&b,&p);
	for(register int i=a;i<=b;i++) fa[i]=i;
	for(register int i=a;i<b;i++){
		for(register int j=1;j*j<=i;j++){
			if(i%j==0){
				int w=j,v=i/j;
				if(w>=p&&!noPM[w]){
					for(register int k=i+w;k<=b;k+=w) unnion(i,k);
				}
				if(v>=p&&!noPM[i/j]){
					for(register int k=i+v;k<=b;k+=v) unnion(i,k);
				}
			}
		}
	}
	for(register int i=a;i<=b;i++){
		if(fa[i]==i) ans++; 
	}
	printf("%d",ans);
	return 0;
}
2022/10/6 11:34
加载中...