题意:
t 组样例,每组给你 n 个数,
你要做的是给这些数上色,一共只有11种颜色;
如果两个数的gcd>1的话就可以上同种颜色。
输出每个数是第几号颜色;
比赛思路:
我单纯的以为先给前11个数,分别上1-11的颜色,然后之后的每个数字,都从前11个里看一下,是不是gcd>1,如果是的话就就和那个数同种颜色。同时因为题目说11种颜色一定够用,我就心安理得的这么写了;可惜我又是自以为是了。
题解思路:
比赛的思路又是一个假算法,因为仅仅选前11个数字当做基础,每次从这11个数里选,是一种盲目的行为。
如何才是理智的行为?
选11个各具代表性的;
…因为数据范围就是1000,
2,3,5,7,11,13,17,19,23,29,31。质因子正好11个。
总之就是根据质因子来分配。没有分析的很清楚…
看代码再理解一下吧…
#include<bits/stdc++.h>
using namespace std;
int n,t;
vector<int> ans[1007];
int res[1007];
int main(){
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
auto f=[&](int u){
for (int i=2;i<=u;++i){
if (u%i==0) return i;
}
};
cin>>t;
while (t--){
cin>>n;
for (int i=1;i<=1000;++i) ans[i].clear();
for (int i=1;i<=n;++i){
int u;
cin>>u; ans[f(u)].push_back(i);
}
int ret=0;
for (int i=1;i<=1000;++i){
if (ans[i].size()){
++ret;
for (auto c:ans[i]){
res[c]=ret;
}
}
}
cout<<ret<<"\n";
for (int i=1;i<=n;++i){
cout<<res[i]<<" ";
}
cout<<"\n";
}
return 0;
}