链接: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*1e8之间
如果有多组答案,输出任意一组即可。
解题思路:本题对输出的正整数的要求有两个,一个是要求任意两数互质,这一点我们可以往素数或者连续自然数方面去想
,而第二点要求任意两数乘积的因子个数大于十个,自然数这方面并不好满足这个条件,我们可以往素数方面去想,假设a,b,
c,d为四个素数,那么a*b*c*d将拥有,a,b,c,d,a*b,a*c,a*d,b*c,b*d,a*b*c,b*c*d...等因子,这是大于10个的,并且两两素数相乘
也可以满足互质的条件,最后一点,数据范围不能超过4*1e8,那么我们不能选择2*3,3*5,5*7这样的形势,因为这样会导致第
2000个数特别大的情况,所以我们选择第一个素数和第4000个数相乘,第2个数和第3999个数相乘。。。。这种形式来解题
代码如下
#include<math.h>
#include<iostream>
#include<algorithm>
#define mod 1000000007
using namespace std;
int a[1000005]={0};
int main()
{
for(int i = 2; i <= 1000; i++)
{
if(a[i])
continue;
for(int j = i; j * i <= 100000; j++)
{
a[i * j] = 1;
}
}
long long int ans = 0;
int num[10005] = {0};
for(int i = 2; ans <= 4000; i++)
{
if(!a[i])
{
num[ans] = i;
ans++;
}
}
for(int i = 1; i <= 2000; i++)
{
printf("%d\n", num[i] * num[ans - i]);
}
//printf("%d\n",ans);
}