比赛 2025暑期集训第2场 评测结果 AAAAAAAAAA
题目名称 整数合并 最终得分 100
用户昵称 淮淮清子 运行时间 0.121 s
代码语言 C++ 内存使用 4.47 MiB
提交时间 2025-06-29 15:19:39
显示代码纯文本
#include<iostream>
#include<cstring>
#include<unordered_map>
#include<vector>
#include<unordered_set>
using namespace std;

const int MAXN = 100005;

int A, B, P;
int f[MAXN];
int prime[MAXN];

unordered_set<int> t;
unordered_map<int, vector<int> > mp;

void count_prime(){
	memset(prime, 0, sizeof(prime));
    for(int i = 2;i < MAXN;i ++){
    	if(prime[i] == 0) {
            prime[i] = i;
            if(1ll * i * i < MAXN){
                for(int j = i * i;j < MAXN;j += i){
                    if(prime[j] == 0){
                    	prime[j] = i;
					}
                }
            }
        }
    }
    return;
}

int fd(int x){
	return (f[x] == x) ? x : f[x] = fd(f[x]);
}

void comb(int x, int y){
	int fx = fd(x), fy = fd(y);
	f[fy] = fx;
	return;
}

int main(){
	freopen("setb.in","r",stdin);
	freopen("setb.out","w",stdout);
	cin.tie(0) -> ios::sync_with_stdio(0);
	cin >> A >> B >> P;
	if(P > B){
		cout << B - A + 1 << '\n';
		return 0;
	}
	count_prime();
	for(int i = A;i <= B;i ++) f[i] = i;
	unordered_set<int> st;
	for(int i = A;i <= B;i ++){
		int x = i;
		st.clear();
		while(x > 1){
			int p = prime[x];
			if(p >= P){
				st.insert(p);
			}
			while(x % p == 0){
				x /= p;
			}
		}
		for(int o : st){
			mp[o].push_back(i);
		}
	}
	for(auto x : mp){
		vector<int> cnt = x.second;
		int sz = cnt.size();
		if(sz > 1){
			for(int i = 1;i < sz;i ++){
				comb(cnt[0],cnt[i]);
			}
		}
	}
	int ans = 0;
	for(int i = A;i <= B;i ++){
		if(fd(i) == i) ans ++;
	}
	cout << ans << '\n';
	return 0;
}