中南大学校赛J(CSU2327)——质数筛+并查集

该博客主要介绍了中南大学校赛的一道题目,涉及质数筛和并查集算法。题目要求在给定的数轴区间[A, B](1 <= A <= B <= 1e12)内,当存在两个数i, j为素数P的倍数时,将它们所在的集合合并。由于B - A <= 1e6,因此只需要考虑1e6以内的素数,并通过并查集处理合并操作。博主分享了思路,但提到在实现过程中遇到了从A(1e12)开始遍历的困难,提醒自己以后可以用now = A / p[i]来找到第一个小于等于A的p[i]的倍数。" 125670042,11824147,SpringBoot自定义starter实现分布式任务调度,"['spring boot', '分布式', '任务调度']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://acm.csu.edu.cn:20080/csuoj/problemset/problem?pid=2327

大意:给你一个[A,B]的区间(1<=A<B<=1e12),给你一个素数P,对于每一个大于等于P的素数,如果区间中有两个数i,j是素数p的倍数,则i,j所在的集合应该合并。初始时每个数都是一个集合,问你最后会有多少个集合。

A, B, P, (1 ≤ A ≤ B ≤ 1e12, B ≤ A + 1e6, 2 ≤ P ≤ B)

思路:注意到B-A<=1e6,所以整个区间长度不超过1e6,则对于大于等于1e6的素数,它在集合中至多只有一个倍数,不会产生合并操作,所以都可以忽略。所以可以筛选1e6内的素数,用1e6的并查集映射[A,B]区间,对于每一个满足条件的素数,它的倍数都应该在一个集合中,直接做合并操作即可。

最后没写出来是因为不知道怎么写从A(1e12)开始的遍历。。。。以后要记住,可以用now=A/p[i]得到第一个小于等于A的p[i]的倍数,那么如果小于,now++就可以得到第一个大于A的倍数了。。。。。。。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;

const int maxn=1e6+10;
typedef long long ll;
ll fa[maxn];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值