CF-div2-630-B - Composite Coloring


思路

1.一個數字能夠分解成有限個素數的乘積 —— 唯一分解定理。

2.題目中給出的數是Composite,能分解成兩個數的乘積(it can be represented as a product of two positive integers)。這個小於1000的Composite數分解的一個素數肯定<=31,因為平方小於1000的數分解完只有11個質因數,31*31=961;(31是第11個素數)。

3.所以只要把最小質因子相同的歸為一類即可,根據(2)最后分類數一定小於等於11,滿足題目要求。

代碼

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1100;
int t,n;
int a[maxn];
int prime[11] = {2,3,5,7,11,13,17,19,23,29,31};
int vis[11];
map<int,int > mp;

//1.一個數字能夠分解成若干個素數的乘積——唯一分解定理
//2.小於1000的Composite數 質因子一定有一個是小於等於31的 
//3.所以只要把最小質因子相同的歸為一類即可,根據(2)最后分類數一定小於11 

void solve(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=0;i<11;i++) vis[i] = 0; 
	int cnt = 0;
	for(int i=1;i<=n;i++){
		for(int j=0;j<11;j++){
			if(a[i] % prime[j] == 0){
				if(vis[j]==0) vis[j] = ++cnt;
				mp[i] = vis[j];
				break;
			}
		}
	} 
	cout<<cnt<<endl;
	for(int i=1;i<=n;i++){
		cout<<mp[i]<<" ";
	}
	cout<<endl;
}

int main(){
	cin>>t;
	while(t--){
		solve();
	}	
	return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM