B. Composite Coloring
思路
- 所有合数都可以分解为质数的乘积,当我们通过最小质因子对数字进行涂色时,意味着相同涂色的数字具有共同的最小质因子,从而会满足了gcd(𝑎𝑖,𝑎𝑗)>1的条件。
- 为什么用十一种颜色可以涂满所有的数呢?
第十一个质数为31,又
31 * 31 = 961,根号1000 = 31.62
1000肯定能有小于或等于31的质因子
因此这些合数的最小质因子的最大可能即为31,即用十一种颜色就可以涂满所有的数
代码
#include <iostream>
#include <cstring>
using namespace std;
int p[15] = {2,3,5,7,11,13,17,19,23,29,31};
int color[1010],a[1010];
int flag[15];
int main(){
int t;
cin >> t;
while(t--){
int n;
cin >> n;
memset(a,0,sizeof(a));
memset(color, 0, sizeof(color));
memset(flag, 0, sizeof(flag));
for(int i=1; i<=n; i++){
cin >> a[i];
}
int count = 0;
for(int i=1; i<=n; i++){
for(int j=0; j<11; j++){
if(a[i] % p[j] == 0){
if(flag[j]){
color[i] = flag[j];
break;
}else{
count++;
flag[j] = count;
color[i] = flag[j];
break;
}
}
}
}
cout << count << endl;
for(int i=1; i<n; i++){
cout << color[i] << " ";
}
cout << color[n] << endl;
}
}