质数——夏洛克和他的女朋友

夏洛克和他的女朋友

夏洛克有了一个新女友(这太不像他了!)。

情人节到了,他想送给女友一些珠宝当做礼物。

他买了 n 件珠宝,第 i 件的价值是 i+1,也就是说,珠宝的价值分别为 2,3,…,n+1。

华生挑战夏洛克,让他给这些珠宝染色,使得一件珠宝的价格是另一件珠宝的价格的质因子时,两件珠宝的颜色不同。

并且,华生要求他使用的颜色数尽可能少。

请帮助夏洛克完成这个简单的任务。

输入格式
只有一行一个整数 n,表示珠宝件数。

输出格式
第一行一个整数 k,表示所使用的颜色数;

第二行 n 个整数,表示第 1 到第 n 件珠宝被染成的颜色。

若有多种答案,输出任意一种。

请用 1 到 k 表示你用到的颜色。

数据范围
1 ≤ n ≤ 1 0 5 1≤n≤10^5 1n105
输入样例1:
3
输出样例1:
2
1 1 2
输入样例2:
4
输出样例2:
2
2 1 1 2

题解:

开始一看以为是一个图论的染色问题,发现好难,但是这道题是有特殊性的。我们不同的染色之间一定是存在于质数和合数之间的。那么分成质数和合数两个集合,分别连边那么显然这就是一个二分图,所以我们颜色最多就只用两种颜色就可以了。质数一种,合数一种。

#include 
using namespace std;
const int N=1e5+7;
int prime[N],cnt;
bool isprime[N];
int n;
void init()
{
    for(int i=2;i<=N;i++){
        if(!isprime[i]) prime[cnt++]=i;
        for(int j=0;prime[j]*i<=N;j++){
            isprime[i*prime[j]]=1;
            if(i%prime[j]==0) break;
        }
    }
}
int main()
{
    init();
    int n; cin>>n;
    if(n==2){
        cout<<1<<endl;
        printf("1 1\n");
    }
    else if(n==1){
        cout<<1<<endl;
        printf("1\n");
    }
    else{
        cout<<2<<endl;
        for(int i=2;i<=n+1;i++){
            if(isprime[i]) printf("%d ",2);
            else printf("%d ",1);
        }
        puts("");
    }
}

你可能感兴趣的:(数学)