原题来自:Codeforces Round #400 B.php
Sherlock 有了一个新女朋友(这太不像他了!)。情人节到了,他想送给女朋友一些珠宝当作礼物。c++
他买了 n 件珠宝。第 i 件的价值是 i+1。那就是说,珠宝的价值分别为 2,3,4,⋯,n+1。git
Watson 挑战 Sherlock,让他给这些珠宝染色,使得一件珠宝的价格是另外一件的质因子时,两件珠宝的颜色不一样。而且,Watson 要求他最小化颜色的使用数。ide
请帮助 Sherlock 完成这个简单的任务。spa
只有一行一个整数 n,表示珠宝件数。code
第一行一个整数 k,表示最少的染色数;blog
第二行 n 个整数,表示第 1 到第 n 件珠宝被染成的颜色。如有多种答案,输出任意一种。内存
3
2 1 1 2
样例输入 2get
4
样例输出 2it
2 2 1 1 2
样例说明
由于 2 是 4 的一个质因子,所以第一件珠宝与第三件珠宝的颜色必须不一样。
数据范围与提示:
对于所有数据,1≤n≤105 。
sol:第一眼看上去很难的样子(而后发现是质因数),因而可知最多分红两类,一类质数,一类非质数
Ps:n+1=2和n+1=3要特判下,由于 2,3两个数能够放一块儿,因而只有一类
#include <bits/stdc++.h> using namespace std; typedef int ll; inline ll read() { ll s=0; bool f=0; char ch=' '; while(!isdigit(ch)) { f|=(ch=='-'); ch=getchar(); } while(isdigit(ch)) { s=(s<<3)+(s<<1)+(ch^48); ch=getchar(); } return (f)?(-s):(s); } #define R(x) x=read() inline void write(ll x) { if(x<0) { putchar('-'); x=-x; } if(x<10) { putchar(x+'0'); return; } write(x/10); putchar((x%10)+'0'); return; } #define W(x) write(x),putchar(' ') #define Wl(x) write(x),putchar('\n') const int N=100005; int n; bool Bo[N]; int Prime[N]; inline void Get_Prime() { int i,j; for(i=2;i<=n;i++) { if(!Bo[i]) Prime[++*Prime]=i; for(j=1;j<=*Prime&&Prime[j]*i<=n;j++) { Bo[Prime[j]*i]=1; if(i%Prime[j]==0) break; } } return; } int main() { int i; n=read()+1; if(n==2) return 0*printf("1\n1\n"); if(n==3) return 0*printf("1\n1 1\n"); Get_Prime(); puts("2"); for(i=2;i<=n;i++) { W((Bo[i])?(2):(1)); } return 0; }