牛客寒假算法基础集训营2 H. 处女座的测验(一)(思维)

版权声明:欢迎转载,若转载,请标明出处,如有错误,请指点,也欢迎大佬们给出优化方法 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;
}

猜你喜欢

转载自blog.csdn.net/Charles_Zaqdt/article/details/86632865