【素数二分图染色】 夏洛克和他的女朋友
传送门
题意
\(n\) 个珠宝,第 \(i\) 个珠宝的值是 \(i+1\),也就是珠宝的价值是 \(2,3,4,\dots,n+1\),给这些珠宝染色,使得珠宝的价格是另一个珠宝的质因子的时候,两只珠宝的颜色不同
要求颜色数目最少,输出颜色数目和染色方案
数据范围
\(1\leq n\leq 10^{5}\)
题解
二分图,所有质数放在一边,合数在另一边,所以最多只需要 \(2\) 种颜色
当二分图中没有边的时候只需要 \(1\) 种颜色,有边的时候需要 \(2\) 种
即存在合数的时候有边,无合数的时候无边
- \(1\) 不是任何质因子的倍数,也没有任何的质因子是其倍数,所以 \(1\) 可以和所有的染相同颜色
即当 \(n\geq 3\) 的时候,价值为 \(2,3,4\),必定存在合数,一定需要两种颜色
Code
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<n;i++)
#define per(i,a,n) for(int i=n-1;i>=a;i--)
#define ll long long
const int N=1e5+10;
int primes[N],cnt;
int n;
bool st[N];
void get_primes(int n){
rep(i,2,n+1){
if(!st[i]) primes[++cnt]=i;
for(int j=1;primes[j]<=n/i;j++){
st[primes[j]*i]=1;
if(i%primes[j]==0) break;
}
}
}
int main(){
cin>>n;
get_primes(n+1);
if(n>2) cout<<2<<endl;
else cout<<1<<endl;
rep(i,2,n+2){
if(!st[i]) cout<<1<<" ";
else cout<<2<<" ";
}
return 0;
}

浙公网安备 33010602011771号