链接:https://ac.nowcoder.com/acm/contest/327/H
来源:牛客网
题目描述
处女座进行了一场c语言的考试,要求很简单,输出2000个正整数,并且满足以下条件:
- 任意两个数互质
- 任意两个数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;
}