30分
  • 板块P1621 集合
  • 楼主shuhao
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/7 11:54
  • 上次更新2024/8/7 13:40:30
查看原帖
30分
1097884
shuhao楼主2024/8/7 11:54
#include <bits/stdc++.h>
using namespace std;

const int N = 1e5;
int a, b, p, cnt;
int fa[N+10];
bool vis[N+10];

void init() {
	cnt = b-a+1;
	for(int i = a; i <= b; i++) fa[i] = i;
	vis[1] = true;
	for(int i = 2; i <= b; i++) {
		if(vis[i] == false)
			for(int j = i*2; j <= b; j += i)
				vis[j] = true;
	}
}

int find(int x) {
	if(fa[x] == x) return x;
	return fa[x] = find(fa[x]);
}

void merge(int x, int y) {
	x = find(x); y = find(y);
	if(x == y) return;
	fa[x] = y;
	cnt--;
}

int main() {
	cin >> a >> b >> p;
	init();
	for(int i = p; i <= b; i++) {
		if(vis[i] == false) {
			int hj = -1;
			for(int j = i*2; j <= b; j += i) {
				if(j >= a) {
					if(hj == -1) {
						hj = j;
					} else {
						merge(hj, j);
					}	
				}
			}
		}
	}
	cout << cnt;
    
    return 0;
}
2024/8/7 11:54
加载中...