我是靠谱客的博主 鲜艳鸡翅,最近开发中收集的这篇文章主要介绍求集合问题(并查集+筛选求素数/C++),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述



Set
【题目描述】现在给你一些连续的整数,它们是从A到B的整数。一开始每个整数都属于各自的集合,然后你需要进行如下操作:
每次选择两个属于不同集合的整数,如果这两个整数拥有大于等于P的公共质因数,那么把它们所在的集合合并。
反复上述操作,直到没有可以合并的集合为止。
现在Caima想知道,最后有多少个集合。
【输入】
一行,三个整数A,B,P。
【输出】
一个数,表示最终集合的个数。
【输入样例】
10  20  3
【输出样例】
7
【数据规模】
   A≤B≤100000;
   2≤P≤B。
【注意事项】
有80%的数据B≤1000。
样例解释{10,20,12,15,18},{13},{14},{16},{17},{19}。

很简单的并查集,用筛选法求出b以内的素数,查找p~b以内的素数的倍数做并查集,代码如下

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
bool f[100001];
int q[100001];
int find(int x)
{
if (q[x]==x) return x; else return find(q[x]);
}
int main()
{
int a,b,p;
cin >> a >> b >> p;
memset(f,1,sizeof(f));
int i,j;
for(i=2;i<=313;i++)
{
if (f[i]==1)
{
for(j=2;j<=100000/i;j++)
{
f[i*j]=0;
}
}
}
for(i=a;i<=b;i++)
{
q[i]=i;
}
for(i=p;i<=b;i++)
{
if (f[i]==0) continue;
for(j=a/i*i;j<=b;j+=i)
{
if (j<a) continue;
if(a%i==0) q[find(j)]=find(a);else q[find(j)]=find((a/i+1)*i);
}
}
int ans=0;
for(i=1;i<=b;i++)
{
if (q[i]==i) ans++;
}
cout << ans;
return 0;
}


最后

以上就是鲜艳鸡翅为你收集整理的求集合问题(并查集+筛选求素数/C++)的全部内容,希望文章能够帮你解决求集合问题(并查集+筛选求素数/C++)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部