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;
}