题解:UVA10140 Prime Distance

数据范围太大

于是采用一个类似于离散化的操作

首先需要明确一个定理

如果n是一个合数, 那么n一定有一个不超过根号n的指数因子

于是我们先筛1~100000的素数

然后暴力扫一遍将L~R内的素数映射到一个数组里

暴力枚举最大最小即可

qwq注意输出换行,并且开long long,一般情况开long long总不会亏

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 const int N=100010; 
 5 const int X=2147483647;
 6 typedef long long ll; 
 7 using namespace std;
 8 bool vis[N*10];
 9 ll prime[N], k=0;
10 ll prime2[N*10], top=0;
11 void shai(){
12     memset(vis,false,sizeof(vis));
13     k=0;
14     for(ll i=2; i<N; ++i){
15         if(!vis[i])
16             prime[++k]=i;
17         for(int j=i*2; j<N; j+=i)
18             vis[j]=true;
19     }
20 }
21 int main(){
22     shai();
23     ll L, R;
24     while(scanf("%lld%lld", &L, &R)!=EOF){
25         L=max(L, 2ll);
26         top=0;
27         memset(vis, 0, sizeof(vis));
28         for(ll i=1; prime[i]*prime[i]<=R && i<=k; ++i){
29             int s=L/prime[i]+(L%prime[i]>0);
30             if(s==1)    s=2;
31             for(ll j=prime[i]*s; j<=R; j+=prime[i])
32                 vis[j-L]=true;
33         }
34         for(ll i=0; i<=R-L; ++i)
35             if(!vis[i])    prime2[++top]=i+L;
36         ll minn=X, a=0;
37         ll maxn=0, b=0;
38         for(ll i=1; i<top; ++i){
39             if(prime2[i+1]-prime2[i]<minn){
40                 minn=prime2[i+1]-prime2[i];
41                 a=i;
42             }
43             if(prime2[i+1]-prime2[i]>maxn){
44                 maxn=prime2[i+1]-prime2[i];
45                 b=i;
46             }
47         }
48         if(top<2)
49             printf("There are no adjacent primes.
");
50         else
51             printf("%lld,%lld are closest, %lld,%lld are most distant.
", prime2[a], prime2[a + 1], prime2[b], prime2[b + 1]);
52     }
53     return 0;
54 } 
原文地址:https://www.cnblogs.com/Aze-qwq/p/9871035.html