80分代码求助!!!
  • 板块P1621 集合
  • 楼主cscst
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/8/29 11:58
  • 上次更新2023/11/4 08:39:33
查看原帖
80分代码求助!!!
337517
cscst楼主2021/8/29 11:58

第二个和第八个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;
}
2021/8/29 11:58
加载中...