处女座的测验 素数,构造

题目链接: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个数了(如果不是首尾相乘而是相邻两个相乘,到后面会超过题目要求的范围)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=1<<30;
const int maxn=1e6+7;
const double pi=acos(-1);
const int mod=1e9+7;
int phi[maxn], prime[maxn],book[maxn];
int cnt;//tot计数,表示prime[N]中有多少质数 
void GetPrime(){
    cnt = 0;
    memset(book,0,sizeof(book));
    for(int i=2;i<maxn;i++){
        if(!book[i]){
            prime[cnt++] = i;
            if(cnt == 4000) break;
            for(int j=i+i;j<maxn;j += i){
                book[j] = 1;
            }
        }
    }
}
int main(){    
    GetPrime();
    int l=0,r=3999;
    for(int i=0;i<2000;i++){
        cout<<prime[l]*prime[r]<<endl;
        l++,r--;
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/qingjiuling/p/10682333.html