Codeforces 1332B - Composite Coloring (数学)

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;
    }
    
}
posted @ 2020-04-14 13:18  limil  阅读(184)  评论(0编辑  收藏  举报