[codeforces 1333F] Kate and imperfection 先加入所有质数,再加入最大约数为2的数,紧接着加入最大约数为3的数,以此类推

本文详细解析了Codeforces Round #632 (Div.2) 中的问题 F-Kate and imperfection。通过手工算法,逐步介绍了如何先加入所有质数,再加入最大约数为2、3等的数的过程,最终实现AC代码的编写。该文章适合对算法竞赛感兴趣的学习者。

Codeforces Round #632 (Div. 2)   比赛人数12810

[codeforces 1333F]   Kate and imperfection   先加入所有质数,再加入最大约数为2的数,紧接着加入最大约数为3的数,以此类推

总目录详见https://blog.csdn.net/mrcrack/article/details/103564004

在线测评地址https://codeforces.com/contest/1333/problem/F

ProblemLangVerdictTimeMemory
F - Kate and imperfection GNU C++17Accepted155 ms3900 KB

手工算法如下

11


1 1 1 1 1 2 3 3 4 5


1,2,3,4,5,6,7,8,9,10,11

先加入所有质数,还包括了1,得到如下数据
1,2,3,5,7,11可以管到I2-I6的输出
1 1 1 1 1 1

I7的情况:1,2,3,5,7,11,4.加入了最大约数是4=2*2的情况。最大值gcd(2,4)=2
I8的情况:1,2,3,5,7,11,4,6.加入了最大约数是6=3*2的情况。最大值gcd(3,6)=3
I9的情况:1,2,3,5,7,11,4,6,9.加入了最大约数是9=3*3的情况。最大值gcd(3,9)=3
I10的情况:1,2,3,5,7,11,4,6,9,8.加入了最大约数是8=4*2的情况。最大值gcd(4,8)=4
I11的情况:1,2,3,5,7,11,4,6,9,8,10.加入了最大约数是10=5*2的情况。最大值gcd(5,10)=5


AC代码如下

#include <stdio.h>
#define maxn 500010
int p[maxn],ans[maxn],an=1;//p[i]=0表示i是质数
int main(){
	int n,i,j;
	scanf("%d",&n);
	p[1]=1;//因之后的数据处理而设置
	for(i=2;i<=n;i++)
		for(j=i+i;j<=n;j+=i)//j是以i为约数的合数
			p[j]=1;//合数
	for(i=2;i<=n;i++)
		if(p[i]==0)ans[++an]=1;//加入所有质数
	for(i=2;i<=n;i++)//i是(i*j)对应的最大约数
		for(j=1;i*j<=n;j++)
			if(p[j]==0){//合数(i*j)另外一个因子是质数j
				ans[++an]=i;//加入最大约数为i的合数(i*j);
				if(!(i%j))break;//为了保证i是最大约数,此处必须中断
			}
	for(i=2;i<n;i++)printf("%d ",ans[i]);
	printf("%d\n",ans[n]);
	return 0;
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值