【思路】与 Problem 46 类似,我们先取一个足够大的上限 $n$,先欧拉筛得到质数表和合数表。
在判断合数是否有四个不同的质因数时,我们同样可以采取二分,找到不超过它的最大质数,然后倒着循环,统计出它的不同质因数个数即可。
总体时间复杂度为 $\mathcal O(n \log n)$:
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 49 50 51 52 53 54 55 56 57 58 59 60 61
| #include<bits/stdc++.h> using namespace std; const int maxn=1000000; int prime[maxn],composite[maxn]; bool vis[maxn]; void euler() { vis[0]=vis[1]=true; for(int i=2;i<=maxn;++i) { if(!vis[i])prime[++prime[0]]=i; for(int j=1;i*prime[j]<=maxn&&j<=prime[0];++j) { vis[i*prime[j]]=true; composite[++composite[0]]=i*prime[j]; if(i%prime[j]==0)break; } } sort(composite+1,composite+composite[0]+1); } int binary(int l,int r,int x) { while(l<=r) { int mid=(l+r)>>1; if(prime[mid]>x)r=mid-1; else l=mid+1; } return r-1; } bool check(int x) { if(!vis[x])return false; int cnt=0,tmp=0; for(int i=binary(1,x,x);i;--i) { bool flag=false; while(x%prime[i]==0) { flag=true; x/=prime[i]; } cnt+=flag; if(cnt==4)return x==1; } return false; } int main() { euler(); for(int i=1;i<=composite[0];++i) { int x=composite[i]; if(check(x)&&check(x+1)&&check(x+2)&&check(x+3)) { printf("%d",x); return 0; } } return 0; }
|