【素数二分图染色】 夏洛克和他的女朋友

传送门

题意

\(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;
}
posted @ 2020-10-23 17:16  Hyx'  阅读(93)  评论(0)    收藏  举报