80分两个tle,如何优化┭┮﹏┭┮
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int bcj[N], size[N], ans, kuku[N] = {1, 1}, prime[N], p;
//线筛优化
void zhishu(int n){
for(int i = 2; i <= n; i++){
if(kuku[i] == 0) {prime[p] = i; p++;}
for(int j = 0; j < p && prime[j]*i <= n; j++) kuku[prime[j]*i] = 1;
}
}
int isprime(int x){
if(kuku[x]) return 0;
return 1;
}
/*int isprime(int x){
for(int i = 2; i*i <= x; i++)
if(x%i == 0) return 0;
return 1;
}*/
int gcd(int a, int b){
if(b == 0) return a;
return gcd(b, a%b);
}
//并查集优化
void init(int x, int y){
for(int i = x; i <= y; i++ ){
bcj[i] = i;
size[i] = 1;
}
}
int find(int x){
if(x == bcj[x]) return x;
return bcj[x] = find(bcj[x]);
}
void join(int aa, int bb){
int a = find(aa), b = find(bb);
if(a != b) {
if(size[a] < size[b]) swap(a, b);
bcj[b] = a;
size[a] += size[b];
}
}
int main(){
int a, b, q; cin >> a >> b >> q;
int n = b-a+1;
ans = n;
init(a, b);
zhishu(b);
//思路是一一枚举每两个数的情况,不知道咋优化了
for(int i = a; i <= b; i++){
for(int j = a; j <= b; j++){
if(find(i) == find(j)) continue;
int tmp = gcd(i, j);
if(tmp >= q && isprime(tmp)) {
join(i, j);
ans--;
break;
//cout << i << ' ' << j << ' ' << ans << endl;
}
}
}
cout << ans;
return 0;
}