原題來自: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; }