求时间复杂度分析
查看原帖
求时间复杂度分析
420102
phmaprostrate楼主2021/7/24 09:47

T两个点

#include<bits/stdc++.h>
#define int long long
#define R register
using namespace std;
int a,b,p;
const int N = 1e5 + 10;
int plist[2 * N],fa[2 * N],sum[2 * N];
int pcnt = 0,num = 0; 
set<int> q;
bool not_prime[2 * N];
inline int gcd(int x,int y){
	if(y == 0) return x;
	else return gcd(y,x%y);
}
inline void prime(){
	for(R int a = 2;a <= N / 2;a++){
		if(not_prime[a] == false) plist[++pcnt] = a,q.insert(a);
	    for(R int b = 1;b <= pcnt;b++){
	    	int x = a * plist[b];
	    	not_prime[x] = true;
	    	if(x > N / 2) break;
	    	if(a % plist[b] == 0) break;
		}	 
	}
}
inline void init(){
	for(R int i = 1;i <= N / 2 ;i++)
	 fa[i] = i,sum[i] = 1;
}
inline int get(int x){
	if(x == fa[x]) return x;
	return fa[x] = get(fa[x]);
}
inline void memge(int x,int y){
	int xx = get(x),yy = get(y);
	fa[xx] = yy;
	sum[yy] += sum[xx];

}
//void out(){
//	for(int i = a;i <= b;i++){
//		cout<<sum[get(i)]<<" ";
//	}
//	cout <<endl;
//}
signed main(){
	scanf("%d%d%d",&a,&b,&p);
	prime();
	
           init();
           for(R int i = a;i < b;i++){
           	for(R int j = a + 1;j <= b;j++){
                   int aa = get(i),bb = get(j),g = gcd(i,j);
				   if(aa != bb && g >= p && q.count(g) != 0){
				   	 {
						  memge(i,j);
						//  out();
						  //cout<<i <<" " << j<<endl;
					 }
				   }           		
			   }
		   }
		  // num = b - a + 1;
		 for(R int i = a;i <= b;i++){
		 	 int aa = get(i);
		 	if(sum[aa] >= 1) num ++;
		     //cout <<sum[aa] <<endl;
		 	 sum[aa] = 0;
			  		 }
		 printf("%d",num);
	return 0;
}

2021/7/24 09:47
加载中...