n个珠宝,第 i 个珠宝的值是i+1,也就是珠宝的价值是2,3,4,......,n+1,
给这些珠宝染色,使得珠宝的价格是另一个珠宝的质因子的时候,两只珠宝的颜色不同
要求颜色数目最少,输出颜色数目和染色方案
n∈[1,1e5]
# 题解
二分图,所有质数放在一边,合数在另一边,所以最多只需要2种颜色
当二分图中没有边的时候只需要1种颜色,有边的时候需要2种
即存在合数的时候有边,无合数的时候无边
即当n>=3的时候必定存在合数。
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=1e5+10; 4 int p[N],cnt; 5 bool st[N]; 6 void get_primes(int n){ 7 for(int i=2;i<=n;i++){ 8 if(!st[i]) p[cnt++]=i; 9 for(int j=0;p[j]<=n/i;j++){ 10 st[p[j]*i]=true; 11 if(i%p[j]==0) break; 12 } 13 } 14 } 15 int main(){ 16 int n; 17 cin>>n; 18 get_primes(n+1); 19 if(n>2) puts("2"); 20 else puts("1"); 21 22 for(int i=2;i<=n+1;i++){ 23 if(st[i]) 24 cout<<'2'<<' '; 25 else cout<<'1'<<' '; 26 } 27 }
来源:https://www.cnblogs.com/hhyx/p/12602690.html