题解 P1621 【集合】
解题报告:
筛出1-100000当中所有的素数 进行预处理
采用线性筛 不会请左转 P3383 【模板】线性筛素数
对于集合划分 很自然就会想到用并查集维护其连通性 对于性质相同的元素合并入同一个集合 最后统计父亲节点个数即可
刚开始有一个地方想错了
我刚开始是这样进行并查集维护的
px=find(prime[i]);for (int j=1;j*prime[i]<=b;j++){py=find(j*prime[i]);if (px==py) continue;f[py]=px;}
然后统计在a-b区间内的祖先节点个数 乍一看很对 其实错得很离谱
仔细想一想就会知道 这样维护的话 最后的祖先节点会统一到
$prime[i]$ 上去 如果出现一个$prime[i]$不在a-b的区间内 就会
有一部分的父亲节点在区间外 那么统计答案答案时候就会丢失一部分数据
那么怎么办呢?
找出当前素数在a-b的范围表示的第一个数 然后在进行维护的时候 统一到第一个数 那么我们最后在进行扫描的时候 就可以保证对于每一个集合的父亲都在区间内
代码如下:
#include<bits/stdc++.h>
using namespace std;
int prime[100005],v[100005],tot;
int a,b,p,f[100005],px,py,ans;
void pri(){for (int i=2;i<=100000;i++){if (!v[i]){v[i]=i;prime[++tot]=i; }for (int j=1;j<=tot;j++){if (v[i]<prime[j]||i*prime[j]>100000) break;v[prime[j]*i]=prime[j];}}
}
int find(int x){if (x==f[x]) return x;return f[x]=find(f[x]);
}
int main(){pri();//for (int i=1;i<=100;i++) printf("%d\n",prime[i]);scanf("%d%d%d",&a,&b,&p);for (int i=1;i<=100005;i++) f[i]=i; for (int i=1;i<=tot;i++)if (prime[i]>=p){/*px=find(prime[i]);for (int j=1;j*prime[i]<=b;j++){py=find(j*prime[i]);if (px==py) continue;f[py]=px;*///集合合并错误 不是与素数合并为一个集合 而是与在a-b的范围类符合条件的数合并为一个集合int flag=1,tmp; for (int j=1;j*prime[i]<=b;j++){if (j*prime[i]>=a&&flag){tmp=j*prime[i];flag=0;px=find(tmp);}//寻找第一个符合条件的数 作为集合合并的对象if (j*prime[i]>=a){py=find(j*prime[i]);if (px==py) continue;f[py]=px;} }} for (int i=a;i<=b;i++)if (f[i]==i) ans++;printf("%d\n",ans);return 0;
}
转载于:https://www.cnblogs.com/Hiraeth-dh/p/10884205.html
题解 P1621 【集合】相关推荐
- 洛谷题解——P1621 集合
题目相关 题目链接 洛谷,https://www.luogu.com.cn/problem/P1621. MYOJ,http://47.110.135.197/problem.php?id=5342. ...
- 洛谷P1621 集合
题目描述 Caima 给你了所有 [a,b][a,b] 范围内的整数.一开始每个整数都属于各自的集合.每次你需要选择两个属于不同集合的整数,如果这两个整数拥有大于等于 pp 的公共质因数,那么把它们所 ...
- LeetCode 700题 题解答案集合 Python
2019.5.12更新至题号796,目前共有265题. 2019.5.26更新至题号72, 目前共有347题. 2019.6.16更新至题号70,目前共有382题. 2019.7.7更新至题号5120 ...
- JZOJ6893. 【2020.11.25提高组模拟】小 T 与灵石(stone)题解
这道题需要转化,换根和卡常. 首先将集合中的点拉出来,找它们的直径 不需要什么虚树,随便挑一个集合里的点为根,做一遍dfs,找最远点x(要在集合里),以x为根重复以上操作,找到最远点y,x-y就是题解 ...
- LeetCode 309. Best Time to Buy and Sell Stock with Cooldown--Java解法-卖股票系列题目
此文首发于我的Jekyll博客:zhang0peter的个人博客 LeetCode题解文章分类:LeetCode题解文章集合 LeetCode 所有题目总结:LeetCode 所有题目总结 题目地址: ...
- 从LeetCode 679. 24 Game--C++ 解法--二十四点 到穷举24点所有可能性-24点大全
从LeetCode 679. 24 Game–C++ 解法–二十四点 到穷举24点所有可能性 此文首发于我的个人博客:zhang0peter的个人博客 LeetCode题解文章分类:LeetCode题 ...
- 数据结构线段树介绍与笔试算法题-LeetCode 307. Range Sum Query - Mutable--Java解法
此文首发于我的个人博客:zhang0peter的个人博客 LeetCode题解文章分类:LeetCode题解文章集合 LeetCode 所有题目总结:LeetCode 所有题目总结 线段树(Segme ...
- LeetCode 31. Next Permutation-- Python 解法--数学题--比当前数大的最小的数
LeetCode 31. Next Permutation-- Python 解法–数学题–比当前数大的最小的数 此文首发于我的个人博客:LeetCode 31. Next Permutation-- ...
- LeetCode 123. Best Time to Buy and Sell Stock III--Python解法--动态规划--数学题
此文首发于我的个人博客:zhang0peter的个人博客 LeetCode题解文章分类:LeetCode题解文章集合 LeetCode 所有题目总结:LeetCode 所有题目总结 题目地址:Best ...
- Intervals on the Ring
Intervals on the Ring 题意: 给出环上的一组区间,需要构造环上的一组区间使得这些区间的交是给定的区间的并 题解: 集合的摩尔定理告诉我们:∪Ai‾=∩Ai‾\overline{\ ...
最新文章
- Java的IDEA最常用快捷键汇总+快速写出Main函数
- Decode()函数使用技巧
- CI 扩展 Service
- 大数据(1) - 虚拟机集群搭建
- leetcode 238. Product of Array Except Self | 238. 除自身以外数组的乘积(Java)
- 快来看看你们的新年礼物,猜猜是什么?
- 字符串url获取参数_如何从URL查询字符串获取示例参数或将其附加到URL查询字符串(示例)?...
- (1-e^(-j5w))/(1-e^(-jw))=e^(-j2w)*sin(5w/2)/sin(w/2)的证明过程
- Python matplotlib绘制饼图
- 接口测试之json中的key获取
- MIPS 已死,转身投靠 RISC-V!
- [转]如何设置opengl结合vc开发绚丽的3D图形---操作详解
- DAS、NAS、SAN三种存储架构比较
- QQ在线等级算法实现
- Representation Learning with Contrastive Predictive Coding 论文阅读笔记
- 移动端 php 开源,poscms移动端地址函数
- 10分钟看完,一文教你Docker 从入门到精通(值得收藏的教程)
- webpack Uncaught ReferenceError: Swiper is not defined
- Oracle数据库迁移到人大金仓KingBase数据库
- 书呆子rico_Excel书呆子优胜者的夏季赠品