首页 > 其他分享 >洛谷题单指南-集合-P1621 集合

洛谷题单指南-集合-P1621 集合

时间:2024-03-26 09:55:37浏览次数:33  
标签:洛谷题 合并 素数 P1621 等于 集合 大于

原题链接:https://www.luogu.com.cn/problem/P1621

题意解读:a~b之间的数,把有大于等于p的公共质因数的数进行合并作为一个集合,求一共有多少个集合。

解题思路:

要进行集合合并、统计集合数,可以使用并查集,有两种做法:

1、暴力法

80%的数据在1000范围内,因此通过双重循环枚举,判断两个数的最大公约数是否大于等于p,是则合并集合,最后统计集合数即可,应该可以得到80分,这里不做详细介绍。

2、素数筛法

进一步分析题意,有大于等于p的公共质因数的即为一个集合,只需要先筛出a~b之间大于等于p的素数,然后对每一个素数,将其倍数进行合并即可,最后统计集合的数量:p[i] == i。

100分代码:

#include <bits/stdc++.h>
using namespace std;
/*
1、筛出a~b之间所有素数
2、从p开始,对于大于等于p的所有素数k,如果2k<=b,将[a,b]范围内k、2k、3k。。。。对应的数标合并到一个集合
3、剩余未标记的元素各为一个集合
*/

const int N = 1e5 + 5;

int primes[N], cnt;
bool flag[N];
int p[N]; //集合
int a, b, t;

//查找x所在集合
int find(int x)
{
    if(p[x] == x) return p[x];
    return p[x] = find(p[x]);
}
//将x、y合并
void merge(int x, int y)
{
    p[find(x)] = find(y);
}

//埃氏筛
void get_primes()
{
    for(int i = 2; i <= b; i++)
    {
        if(!flag[i]) 
        {
            if(i >= t) primes[++cnt] = i;
            for(int j = i + i; j <= N; j += i)
            {
                flag[j] = true;
            }
        }
    }
}

int main()
{
    cin >> a >> b >> t;
    for(int i = a; i <= b; i++) p[i] = i; //初始化集合
    get_primes(); //筛出a~b之间大于等于p的素数
    for(int i = 1; i <= cnt; i++)
    {
        int j = primes[i];
        while(j < a) j += primes[i]; // 找到第一个大于等于a的以primes[i]为因子的数
        int last = j;
        while(j + primes[i] <= b)
        {
            j += primes[i];
            merge(last, j); //将以primes[i]为因子的数进行合并
        }
    }
    int ans = 0;
    for(int i = a; i <= b; i++)
    {
        if(p[i] == i) ans++;
    }
    cout << ans;

    return 0;
}

 

标签:洛谷题,合并,素数,P1621,等于,集合,大于
From: https://www.cnblogs.com/jcwy/p/18095929

相关文章

  • Java面试必问题18:线程安全的集合类和有序的集合类
         精华篇:  极致精简解释有序的集合类包括:TreeMap-基于红黑树实现的有序Map。LinkedHashMap-基于哈希表和双向链表实现的有序Map。TreeSet-基于红黑树实现的有序Set。LinkedHashSet-基于哈希表和双向链表实现的有序Set。示例:有序Map:TreeMap有序Li......
  • GEE入门及进阶教程|在 Earth Engine 中绘制图像集合
            在前面的内容中,我们计算了增强植被指数(EVI),以说明卫星图像上的波段运算,代码在单个图像上被调用一次。如果我们想以相同的方式计算整个ImageCollection中的每个图像的EVI,该怎么办?在这里,我们使用EarthEngine工作流程第二部分的关键工具,即.map命令。......
  • 学点儿Java_Day10_集合框架(List、Set、HashMap)
    1简介ArrayList:有序(放进去顺序和拿出来顺序一致),可重复HashSet:无序(放进去顺序和拿出来顺序不一定一致),不可重复 @Testpublicvoidtest1(){String[]array=newString[3];//List:有序可重复//有序:放入顺序与拿出顺序......
  • 【知识点】高并发中的集合
    本文旨在总结多线程情况下集合的使用Java中的集合大致以下三个时期:第一代线程安全集合类以Vector、HashTable为代表的初代集合,使用synchronized在修饰方法,从而保证线程安全。缺点:效率低。代码示例Vectoradd方法源码/***Appendsthespecifiedelementtotheendoft......
  • set集合 and 字典 笔记
    set()集合S={1,"你好",2,3}print(type(s))print(s)不可哈希:python中的set集合进行数据存储的时候。需要对数据进行哈希计算,根据计算出的哈希值进行数据存储set集合要求存储必须是可以进行哈希计算的可哈希:不可变的数据类型,int,str,tuple,bool不可哈希:可变的数据类型,kli......
  • 浅谈Java中的集合
    下面内容自己结合B站视频写的总结为什么要用集合一般情况下保存多个数据使用的数组,但是数组灵活性不够,有很多不足,如:长度开始时必须指定,而且指定之后不能修改保存的必须为同一类型的元素使用数组进行增删比较麻烦集合1、集合可以根据需要动态增加或减少其大小2、Jav......
  • 构建树形结构集合的方法-Java
    完整代码如下构建树形结构方法importjava.lang.reflect.Field;importjava.util.ArrayList;importjava.util.LinkedList;importjava.util.List;publicclassTableUtils<T>{/***集合构建成层级结构**ps:处于顶级的数据,上下级字段值必须为......
  • 【动态规划】【同余前缀和】【多重背包】[推荐]2902. 和带限制的子多重集合的数目
    本文涉及知识点动态规划汇总C++算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例包括课程视频C++算法:滑动窗口总结多重背包LeetCode2902.和带限制的子多重集合的数目给你一个下标从0开始的非负整数数组nums和两个整数l和r。请你返回nums中子多重集......
  • Zset有序集合
    有序集合相对于字符串、列表、哈希、集合来说会有⼀些陌⽣。它保留了集合不能有重复成员的特点,但与集合不同的是,有序集合中的每个元素都有⼀个唯⼀的浮点类型的分数(score)与之关联,使用分数作为排序依据。有序集合中的元素是不能重复的,但分数允许重复。普通命令zadd添加或......
  • Set集合命令
    集合类型也是保存多个字符串类型的元素的,元素之间是无序的且不能重复。Redis除了⽀持集合内的增删查改操作,同时还⽀持多个集合取交集、并集、差集,合理地使⽤好集合类型,能在实际开发中解决很多问题。普通命令sadd将⼀个或者多个元素添加到set中。注意,重复的元素⽆法添......