【题目描述】
处女座进行了一场 c 语言的考试,要求很简单,输出2000个正整数,并且满足以下条件:
1.任意两个数互质
2.任意两个数 x,y,满足 τ(x*y)>10,其中为 n 的因子的个数
举例:6的因子有1,2,3,6,所以 τ(6)=4
【输入描述】
本题没有输入
【输出描述】
2000行,每行一个正整数
输出的每个整数都必须在1-4*10^8之间
如果有多组答案,输出任意一组即可。
思路:
根据 τ 函数的性质,可以推出其是一个积性函数,满足 τ(x⋅y)=τ(x)⋅τ(y),因此只需要保证 τ(x)≥4 即可,打前 4000 个质数的表,然后进行构造,取第 1 个质数与第 4000 个质数相乘,取第 2 个质数和第 3999 个质数相乘,依次类推,这样可保证最大的数在 4e8 以内
【源代码】
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#define PI acos(-1.0)
#define E 1e-6
#define MOD 1000000007
#define INF 0x3f3f3f3f
#define N 1000001
#define LL long long
using namespace std;
LL prime[N],cnt;
bool bprime[N];
void make_prime()
{
memset(bprime,true,sizeof(bprime));
bprime[0]=false;
bprime[1]=false;
for(LL i=2;i<=N;i++)
{
if(bprime[i])
{
prime[cnt++]=i;
for(LL j=i*2;j<=N;j+=i)
bprime[j]=false;
}
}
}
int main(){
make_prime();
for(int i=1;i<=2000;i++)
printf("%lld\n",prime[i]*prime[4000-i]);
return 0;
}