CF1332B Composite Coloring(数学)

题目的信息给的很明显,他告诉我们11个数是肯定能够填满这些颜色的

一个方面我们可以通过这个信息来推断题目所问的问题,发现1000以内的数的因子必定有一个在前11个质数之中,这样我们就发现了盲点

即使没有发现这点,我们也可以大胆猜测,直接对每个数进行分解质因数,之后枚举质数涂色,肯定也能得到答案

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<map>
using namespace std;
const int N=1e5+5;
int a[N];
int ans[N];
int st[N];
int cnt[N];
int main(){
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        int i;
        int num=0;
        memset(cnt,0,sizeof cnt);
        memset(ans,0,sizeof ans);
        memset(st,0,sizeof st);
        int sign=0;
        int flag=0;
        for(i=1;i<=n;i++){
            cin>>a[i];
            if(a[i]%2==0){
                flag=1;
                ans[i]=1;
                st[i]=1;
                num++;
            }
            else{
                int tmp=a[i];
                int j;
                for(j=3;j<=tmp/j;j++){
                    if(tmp%j==0){
                        while(tmp%j==0){
                            tmp/=j;
                        }
                        cnt[j]++;
                    }
                }
                if(tmp)
                    cnt[tmp]++;
            }
        }
        if(flag)
            sign=1;
        for(i=3;i<=170;i++){
            if(num==n)
            break;
            if(cnt[i]){
                int j;
                int tmp=cnt[i];
                for(j=1;j<=n;j++){
                    if(!st[j]&&(a[j]%i==0)){
                        ans[j]=sign+1;
                        st[j]=1;
                        cnt[i]--;
                        num++;
                    }
                }
                if(tmp!=cnt[i])
                    sign++;
            }
        }
        cout<<sign<<endl;
        for(i=1;i<=n;i++)
            cout<<ans[i]<<" ";
        cout<<endl;
 
    }
    return 0;
}
View Code

 

posted @ 2020-04-13 22:58  朝暮不思  阅读(231)  评论(0编辑  收藏  举报