数据范围:
1
≤
n
≤
1
0
5
1 \le n \le 10^5
1≤n≤105
根据题意,把具有题目这种关系看做是一条边,可以发现,这条边必然是一个质数连向一个合数,保证这条边的两端颜色不同即可,因此,所有珠宝之间的关系可以看成很多条边的图。因为题目的限制只存在与一个合数和它的质因子,所以质数之间和合数之间是没有限制条件的,可以看成一个二分图所以最多只需要两种颜色即可。
第一步:预处理
1
0
5
10^5
105之内的所有质数。
第二步:
1.如果珠宝数量小于3,则珠宝的价格全部为质数,所以只需要1种颜色即可。
2.依次枚举每一个珠宝的价值,如果当前这个珠宝的价格是质数则染成1号色,否则为2号色。
#include
#include
#include
using namespace std;
const int N = 100010;
int primes[N], cnt;
bool st[N];
int n;
//线性筛
void init(int n)
{
for(int i = 2; i <= n; i ++)
{
if(!st[i]) primes[cnt ++] = i;
for(int j = 0; primes[j] <= n / i; j ++)
{
st[primes[j] * i] = true;
if(i % primes[j] == 0) break;
}
}
}
int main()
{
init(N);
cin >> n;
//第一种情况 如果珠宝的数量小于3只需要用一种颜色
if(n < 3)
{
cout << 1 << endl;
for(int i = 0; i < n; i ++) cout << 1 << " ";
return 0;
}
//第二种情况 珠宝的数量大于3需要用两种颜色
cout << 2 << endl;
//枚举每一个珠宝的价格
for(int i = 2; i <= n + 1; i ++)
{ //如果当前珠宝的价格是质数就输出1
if(!st[i]) cout << 1 << " ";
else cout << 2 << " ";
}
return 0;
}