夏洛克和他的女朋友
题目描述
![image-20210917095018031](https://img-blog.csdnimg.cn/img_convert/482ea7c25ba90f7954413c8aafa56be0.png)
核心思路
可以将这个题抽象成一个图,所有珠宝的价值是图中的顶点,当一个珠宝的价格是另一个珠宝的质因子时,我们可以在这两个点之间连接一条边。
如果这样建图的话,我们可以将质数放在左边,合数放在右边,则左边内部和右边内部是不可能有边的,只有可能是从质数的节点向合数的节点连一条边,所以此图是一个二分图,一个图是二分图,等价于该图可以二染色。因此,本题最多只会染两种颜色,最少染一种颜色。
那么什么情况下需要染两种颜色,什么情况下需要染一种颜色呢?然后我们仔细挖掘一下该题,可以发现,当珠宝数量
n
≤
2
n\leq 2
n≤2时,我们只需要染一种颜色即可。因为当珠宝数量
n
≤
2
n\leq 2
n≤2时,比如
n
=
1
n=1
n=1,那么珠宝价值是{2},
n
=
2
n=2
n=2,珠宝价值是
2
,
3
{2,3}
2,3,可以发现都是质数集合,因此只需要一种颜色即可。当珠宝数量
n
>
2
n>2
n>2时,则需要染两种颜色,比如
n
=
3
n=3
n=3,那么珠宝价值是
2
,
3
,
4
{2,3,4}
2,3,4,存在质数和合数,因此需要两种颜色。
代码
#include
#include
#include
using namespace std;
const int N=1e5+10;
int primes[N],cnt;
bool st[N];
int n;
//线性筛法筛出1~n中的所有质数
void init(int n)
{
for(int i=2;i |