Description
题目大意是给定不超过1000个和数(均小于1000)。用m(m<=11)颜色染色。其中染上相同颜色的数必定是具有大于1的公约数。
思路
从小到大用素数把含有该素数的数染成相同颜色。由于小于1000,因此前11个素数必定可以覆盖完所有的数。因为第11个素数和第12个素数相乘就已经大于1000了。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e3+10;
#define inf 0x3f3f3f3f
int arr[N];
int c[N];
bool vis[N];
vector<int> prime;
int main() {
ios::sync_with_stdio(false);
for(int i = 2; i <= 1000; i++) {
if(vis[i]) continue;
prime.push_back(i);
for(int j = 2 * i; j <= 1000; j+=i) {
vis[j] = 1;
}
}
int t;
cin >> t;
while(t--) {
memset(c, 0, sizeof c);
int n;
cin >> n;
for(int i = 0; i < n; i++) {
cin >> arr[i];
}
int cnt = 1;
for(auto p : prime) {
bool ok = false;
for(int i = 0; i < n; i++) {
if(c[i]) continue;
if(arr[i] % p == 0) {
c[i] = cnt;
ok = true;
}
}
if(ok) cnt++;
}
cout << cnt - 1 << endl;
for(int i = 0; i < n; i++) cout << c[i] << " ";
cout << endl;
}
}