【欧拉计划】47. Distinct primes factors

【思路】与 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;
}

【欧拉计划】47. Distinct primes factors

https://hensier.github.io/projecteuler/47/

作者

hensier

发布于

2022-05-01

更新于

2023-01-02

许可协议

评论