Codeforces Round #630 (Div. 2) B. Composite Coloring (数论)

Codeforces Round #630 (Div. 2) B. Composite Coloring (数论)

题目传送门

题意:给n个合数(存在两大于1相乘等于ai的因数)将最大公因数大于1的数分为一组,求每个数在哪个组(m<=11)

思路:ai<=1000,由数论知识可知任意大于1的整数的最小的大于1的因数为素数,又该数为合数,必存在一个小于等于sqrt(ai)的因数,所以该素数在sqrt(1000)内。即求出sqrt(1000)的因数即可,经计算可知小于等于sqrt(1000)的因数刚好11个。正好满足。

#include<bits/stdc++.h>
using namespace std;
int pr[12];
void ss(int n){ //线性筛求素数 
	int vis[n+1]={};
	vis[0]=vis[1]=1;
	for(int i=2;i<=sqrt(n);i++)
		 if(!vis[i])
		 	for(int j=i*i;j<=n;j+=i) vis[j]=1;//printf("j=%d\n",j);
	int k=0;
	for(int i=2;i<=n;i++)
		if(!vis[i]) pr[++k]=i;
}
int main(){
	int t,n;
	ss(sqrt(1000));
	/*for(int i=1;i<=11;i++) cout<<pr[i]<<endl; */
	cin>>t;
	while(t--){
		cin>>n;
		int a[n+1],c[n+1]={},cnt=1;
		for(int i=1;i<=n;i++) cin>>a[i];
		for(int i=1;i<=11;i++)
		{	int f=0;
			for(int j=1;j<=n;j++)
				if(a[j]%pr[i]==0&&!c[j])
						c[j]=cnt,f=1;
			if(f) cnt++;
		}
		cout<<cnt-1<<endl;
		for(int i=1;i<=n;i++)
			printf(i==n?"%d\n":"%d ",c[i]);
	}
	return 0;
} 
全部评论

相关推荐

在debug的柠檬精很迷人:好消息:现在HR挑三拣四 15年后 HR跪着求要简历 坏消息:被挑的是这代人,到时候求人的也是这代人。真好。
点赞 评论 收藏
分享
05-30 18:54
武汉商学院 Java
湫湫湫不会java:先投着吧,大概率找不到实习,没实习的时候再加个项目,然后把个人评价和荣誉奖项删了,赶紧成为八股战神吧,没实习没学历,秋招机会估计不多,把握机会。或者说秋招时间去冲实习,春招冲offer,但是压力会比较大
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务