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 }

 

posted @ 2020-04-01 15:35  摸鱼自动机  阅读(329)  评论(0)    收藏  举报