第二个和第八个WA了 输入第二个样例:20 10000 6 就没有输出了,问题应该在第二个for
#include<bits/stdc++.h>
using namespace std;
int l, r, p;
int a[100010][1005], fa[100010];
bool IsPrime(int x) {
for(int i = 2; i <= sqrt(x); i++)
if(x % i == 0)
return false;
return true;
}
int find(int x) {
if(x == fa[x]) return x;
return fa[x] = find(fa[x]);
}
void join(int x, int y) {
int fx = find(x);
int fy = find(y);
if(fx != fy)
fa[fx] = fy;
}
int main() {
memset(a, -1, sizeof(-1));
cin >> l >> r >> p;
for(int i = l; i <= r; i++)
fa[i] = i;
for(int i = l; i <= r; i++) {
//cout << i << endl;
int k = 1, flag = 0;
for(int j = 2; j <= i; j++) {
//cout << j << endl;
if(i % j == 0 && IsPrime(j) && j >= p) {
a[i][k] = j;
k++;
flag = 1;
//cout << i << " " << j << endl;//cout << "Yes";
}
}
a[i][k] = -1;
if(flag == 0)
a[i][1] = -11;
}
//cout << 1;
/*
for(int i = l; i <= r; i++) {
for(int j = 1; j <= i; j++) {
cout << a[i][j] << " ";
}
cout << endl;
}
cout << endl << endl;
*/
for(int i = l; i <= r; i++) {
int j, flag = 0;
if(a[i][1] == -11) continue;
for(j = l; j <= r; j++) {
flag = 0;
if(i == j) continue;
if(a[j][1] == -11) continue;
for(int k = 1; k; k++) {
if(a[i][k] == -1) break;
for(int L = 1; L; L++) {
if(a[j][L] == -1) break;
if(IsPrime(j)) {
//cout << j << endl;
break;
}
if(a[i][k] == a[j][L]) {
//cout << "yes";
flag = 1;
break;
}
}
}
if(flag == 1) join(i, j);//cout << i << " " << j << " " << "yes" << endl;
}
}
/*
for(int i = l; i <= r; i++)
cout << fa[i] << endl;
*/
int ans = 0;
for(int i = l; i <= r; i++)
if(fa[i] == i)
ans++;
cout << ans << endl;
return 0;
}