一切卡常办法都用上了,但是第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;
}