一本通1623Sherlock and His Girlfriend

1623:Sherlock and His Girlfriend

時間限制: 1000 ms         內存限制: 524288 KB

【題目描述】

原題來自:Codeforces Round #400 B.php

Sherlock 有了一個新女朋友(這太不像他了!)。情人節到了,他想送給女朋友一些珠寶當作禮物。c++

他買了 n 件珠寶。第 i 件的價值是 i+1。那就是說,珠寶的價值分別爲 2,3,4,,n+1git

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; }
View Code
相關文章
相關標籤/搜索