题目的信息给的很明显,他告诉我们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; }