B. Composite Coloring

1332B. Composite Coloring

题意

如果一个数字可以表示成两个数字的积,那么称这个数字为组合数。

给出一个由组合数构成的序列 \(a\) ,对序列中的数字染色(最多染 \(11\) 种颜色),要求染相同颜色的任意两个数字的 \(GCD\) 大于1。

构造出这样的染色方案,不要求用的颜色数量最少或者最多。

序列中的数字不超过1000。

分析

相同颜色的数字 \(GCD\) 大于1,那么可以按照质数倍数来染色,如果数字是某个质数的倍数,那么给它染某一种颜色。

序列中的数字不超过1000,那么质数最大只可能取到 \(\sqrt {1000} = 31\) ,而不超过31的质数正好有11个。

Code

#include < bits/stdc++.h >

using namespace std;

int prima[11];
int st[11]; // 存储第i个质数使用的颜色

// 是否为质数
bool is_p (int v)
{
    for (int i = 2; i <= v / i; i ++ ) if (v % i == 0) return false;
    return true;
}

// 初始化前面11个质数
void init ()
{
    int nums = 0;
    for (int i = 2; i <= 31; i ++ ) if (is_p(i)) prima[nums ++] = i;
}

void solve ()
{
    memset(st, -1, sizeof st);
    int n; cin >> n;
    vector<int> color(n);

    int res = 0;
    for (int i = 0; i < n; i ++ )
    {
        int x; cin >> x;
        for (int j = 0; j < 11; i ++ )
            if (x % prima[j] == 0)
            {
                if (st[j] != -1) color[i] = st[j];
                else color[i] = st[j] = ++ res; 
                break;
            }
    }

    cout << res << endl;
    for (int i = 0; i < n; i ++ ) cout << color[i] << ' ';
    cout << endl;
}

signed main () 
{
    
    init();
    int T; cin >> T; while ( T -- )
        solve();

    return 0;
}
posted @ 2021-09-16 15:28  Horb7  阅读(34)  评论(0编辑  收藏  举报