版权声明:欢迎转载,若转载,请标明出处,如有错误,请指点,也欢迎大佬们给出优化方法 https://blog.csdn.net/Charles_Zaqdt/article/details/86632865
题目链接:https://ac.nowcoder.com/acm/contest/327/H
这道题既然要任意两个数互质,那么肯定这些数都是质数,然后我们要考虑怎么让两个数相乘的积的因子个数大于10,对于任意一个质数来说它的因子数都是只有两个1和它本身,那么两个质数相乘就是有4个,比如2和3的话就是1 2 3 6,那么再让这两个质数相乘的积再相乘的话,就会一共有16个因子,比如2 3 5 7,就会有1 2 3 5 6 7 10 14 15 21 30 35 42 70 105 210,所以任意的四个质数相乘的结果的因子个数都是16个,所以根据这个条件我们先筛除前4000个质数,然后首尾两两相乘就可以得到需要的2000个数了(如果不是首尾相乘而是相邻两个相乘,到后面会超过题目要求的范围)
AC代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
int book[N];
int prime[N];
int cnt;
void GetPrime(){
cnt = 0;
memset(book,0,sizeof(book));
for(int i=2;i<N;i++){
if(!book[i]){
prime[cnt++] = i;
if(cnt == 4000) break;
for(int j=i+i;j<N;j += i){
book[j] = 1;
}
}
}
}
int main(){
GetPrime();
int l = 0 , r = 3999;
int n = 1;
while(l < r){
// cout<<n++<<endl;
cout<<prime[l] * prime[r]<<endl;
l++;r--;
}
return 0;
}