E - Ehab and a Special Coloring Problem这又是啥

在这里插入图片描述

说实话,我一开始没懂它在说些什么,我太难了,
给你一个整数n,构造一个数量为n-1的数列,(数列中的元素的范围在2-n,)使得,下标互质的对,他们对应的元素应该不同,注意是下标互质下标互质!并且最好该数列中每个元素要尽可能小。
好了
懵逼ing
我们可以这样想,把1-n的互质数筛出来,然后捏,再把数一个一个填到下标为互为质数的空里面去,那么就只剩下非质数的下标了,现在有一个很严肃的问题,就是非质数也有可能和某些质数互质,那我还得维护这种情况,即保证互不相同;那我接着想,所有的非质数都可以转化成其因子的乘积的形式,那么该因子肯定和这个数不互质,那就拿该因子放在对应非质数下标里,这样就能保证非质数下标与某些质数下标互质的情况下,其对应的值互不相同,一句话,非质数下标对应的元素就是其质因子,然后问题就变成了质数下标的赋值问题
为了使每个元素尽可能小,那我就要从2开始逐个为质数下标赋值

采用质数筛法

看看代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=100050;
int a[maxn];
int main()
{
	int n;
	scanf("%d",&n);
	memset(a,0,sizeof(a));
	int pos=0;
	for(int i=2;i<=n;i++)
	{
		if(!a[i])
		{
			pos++;
			for(int j=1;j*i<=n;j++)
			{
				if(!a[i*j])
					a[i*j]=pos;
			}
		}
	}
	for(int i=2;i<n;i++)
		printf("%d ",a[i]);
	printf("%d\n",a[n]);
	return 0;
}
发布了54 篇原创文章 · 获赞 4 · 访问量 913

猜你喜欢

转载自blog.csdn.net/weixin_45460987/article/details/103218392