题目链接: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; }