[牛客竞赛] 处女座的测验(一)(质数,构造)

版权声明:个人学习笔记记录 https://blog.csdn.net/Ratina/article/details/86644753

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

题目描述

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

  1. 任意两个数互质
  2. 任意两个数x,y,满足τ(x·y)>10,其中τ(n)为n的因子的个数

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

输入描述:

本题没有输入

输出描述:

2000行,每行一个正整数

输出的每个整数都必须在1-4*108之间
如果有多组答案,输出任意一组即可。


分析:


①首先是x,y互质

互质是公约数只有1的两个整数,叫做互质整数

那么很明显,两个质数 互质,两对不同质数的乘积 互质。


②再者是满足τ(x·y)>10

τ 是积性函数,τ(x⋅y)=τ(x)⋅τ(y),那么只要满足 τ(x) 和 τ(y) ≥4 就可以了。观察不同的质数a,b相乘(c = a * b),得到的c的因子有1, a , b , a*b,所以τ( c ) = 4 ,正好满足≥4。

那么就需要找出前4000个质数,令第1个和第4000个相乘,第2个与第3999个相乘…(这样保证输出的数尽量小,不超出范围)


以下代码:

#include <bits/stdc++.h>
using namespace std;
vector<int> prime;
void get_prime(int maxn)     //筛选法获取素数
{
	bool not_prime[1000000] = { 0 };
	for (int i = 2; i <= maxn; i++)
	{
		if (!not_prime[i])
		{
			prime.push_back(i);
			for (int j = i; j <= maxn; j += i)
				not_prime[j] = true;     //将i的倍数筛选掉
		}
		if (prime.size() == 4000)        //获取前4000个素数,随即结束
			break;
	}
}
int main()
{
	get_prime(1000000);
	for (int i = 0; i < 2000; i++)        //输出
		printf("%d\n", prime[i]*prime[3999 - i]);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Ratina/article/details/86644753