链接:https://ac.nowcoder.com/acm/contest/327/H
来源:牛客网
处女座的测验(一)
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
Special Judge, 64bit IO Format: %lld
题目描述
处女座进行了一场c语言的考试,要求很简单,输出2000个正整数,并且满足以下条件:
1.任意两个数互质
2.任意两个数x,y,满足T(x*y)>10,其中为T(n)的因子的个数
举例:6的因子有1,2,3,6,所以T(6)=4
输入描述:
本题没有输入
输出描述:
2000行,每行一个正整数
输出的每个整数都必须在1-4*10^8之间
如果有多组答案,输出任意一组即可。
思路:
一个数的因子数大于10,只要它有四个不同质因子即可,四个不同的质因子可以构成的因子数为222*2=16(不知道为什么的可以去查一个数的因子个数怎么算)
所以x和y都只要有两个不同的质因子即可,然后要让x和y互质,只需要让x和y构成的质因子不同即可。
所以只要筛出前4000个质数,然后两两相乘就就可以满足需求,为了将大小控制在4e8内,将第一个和第4000个相乘即可
AC代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| #include <iostream> #include <cstdio> using namespace std; typedef long long ll; #define wfor(i,j,k) for(i=j;i<k;++i) #define mfor(i,j,k) for(i=j;i>=k;--i)
const ll maxn = 1e6 + 5; ll prime[maxn + 1];
void getprime() { ll i; wfor(i, 2, maxn + 1) { if (!prime[i]) prime[++prime[0]] = i; ll j; for (j = 1; j <= prime[0] && prime[j]*i <= maxn; j++) { prime[i * prime[j]] = 1; if (prime[j] % i == 0) break; } } } int main() { std::ios::sync_with_stdio(false); #ifdef test freopen("F:\\Desktop\\question\\in.txt", "r", stdin); #endif #ifdef ubuntu freopen("/home/time/debug/debug/in", "r", stdin); freopen("/home/time/debug/debug/out", "w", stdout); #endif getprime(); int i; wfor(i, 1, 2001) { cout << prime[i]*prime[4001 - i] << endl; } return 0; }
|