处女座的测验(一)(素数筛+思维)

链接:https://ac.nowcoder.com/acm/contest/327/H
来源:牛客网
 

题目描述

处女座进行了一场c语言的考试,要求很简单,输出2000个正整数,并且满足以下条件:

1.       任意两个数互质

2.     任意两个数x,y,满足,其中为n的因子的个数

举例:6的因子有1,2,3,6,所以τ(6)=4τ(6)=4

输入描述:

本题没有输入

输出描述:


 

2000行,每行一个正整数

输出的每个整数都必须在1-4*108之间

如果有多组答案,输出任意一组即可。

思路:是积性函数T(x*y)=T(x)*T(y)故只需要保证素数的因子为T(x)>=4即可,便可以把前四千个素数筛出来,然后用第一个去×最后一个,这样组成的两千个即可,因为有数据范围,所以我们肯定筛选前4000个

代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

int prime[1000005];
bool vis[1000005];
void erla() {
	int cnt =0;
	memset(vis,false,sizeof(vis));
	memset(prime,0,sizeof(prime));
	for(int t=2; t<=1000005; t++) {
		if(!vis[t]) {
			prime[cnt++]=t;
		}
		for(int j=0; j<cnt&&t*prime[j]<=1000005; j++) {
			vis[t*prime[j]]=true;
			if(t%prime[j]==0) {
				break;
			}
		}
	}
}
int a[4005];
int main()

{
	erla();
	int s=0;
	for(int t=2; t<=1000005; t++) {
		if(!vis[t]) {
			a[s++]=t;
		}
		if(s==4000) {
			break;
		}
	}
	for(int t=0; t<s/2; t++) {
		printf("%d:%d*%d
",a[t]*a[s-t-1],a[t],a[s-t-1]);
	}


	return 0;
}
原文地址:https://www.cnblogs.com/Staceyacm/p/10781827.html