CF 630 DIV2 B
题意:给你一堆合数,要你对这个合数进行染色。输出你使用的颜色数和每一个数所染的颜色。
染色条件:如果这两个数染相同颜色,这两个数的GCD大于1(也就是说这两个数不互质)。
思路来源:https://www.cnblogs.com/fisherss/p/12610766.html
思路:对于合数而言,它必定是某个质数的倍数(唯一分解定理)。再来看下数据范围,这些合数都是1000以内。所以这些数的质因子必定都是小于等于第十一个质数31。
我们把这些合数的最小质因子找出来,相等的质因子归为一类。
输出:输出第一行就是我们使用的质数的个数,第二行按顺序输出这个质数的编号。
1 //author CN.TTDragon
2 #include<bits/stdc++.h>
3 typedef long long ll;
4 using namespace std;
5 int vis[15]={0};
6 int prime[11]={2,3,5,7,11,13,17,19,23,29,31};
7 map<int,int> MP;
8 int main()
9 {
10 int t;
11 cin>>t;
12 while(t--)
13 {
14 for(int i=0;i<15;i++)
15 {
16 vis[i]=0;//多组数据,做完要清零
17 }
18 MP.clear();//多组数据,做完要清零
19 int n;
20 cin>>n;
21 int a[1005]={0};
22 int cnt=0;
23 for(int i=0;i<n;i++)
24 {
25 cin>>a[i];
26 for(int j=0;j<11;j++)
27 {
28 if(a[i]%prime[j]==0)
29 {//看这个质数用过没有,用过的数已经有了编号,没用过的数给它编个号就好了
30 if(vis[j]==0)
31 {
32 cnt+=1;
33 vis[j]=cnt;
34 }
35 MP[i]=vis[j];//用map来储存
36 break;
37 }
38 }
39 }
40 cout<<cnt<<endl;
41 for(int i=0;i<n;i++)
42 {
43 cout<<MP[i]<<" ";
44 }
45 cout<<endl;
46 }
47 return 0;
48 }

浙公网安备 33010602011771号