Primer distancia (gran número de intervalo de calidad interna

# El significado de los problemas

Dados dos números enteros l, r, encontrar el [l, r] el par más cercano de número primo adyacente, y el número de más alejado masa adyacente de un par de intervalo

l, r ∈ [1, 2 31 -1]

Donde rl <= 1E6

# Explicaciones

L, una amplia gama de r, sobre 2E9 lineal algoritmo no puede determinarse [. 1, r] en todos los números primos, pero una pequeña gama de rl,

Cualquier compromiso debe contener un número de no más de √n factores primos, se determina que todos los números primos 2 ~ √r,

Por cada número primo, y [l, r] en la parte alícuota de esta marca figura, el resto es número primo dentro de la gama.

Para la comparación por pares primer máximo valor a

La complejidad de O (√r * log (log r))

1 #include <. Bits / STDC ++ h>
 2  #define ll largo largo
 3  usando  espacio de nombres std;
4  const  int N = 1E6;
5  primos ll [N], cnt;
6  bool st [N];
7  bool rec [N];
8 ll pri [N], num; // 位于l ~ r之间的质数
9  void get_primes ( int n) {
 10      memset (st, falso , sizeof st);
11      para ( int i = 2 ; i <= n; i ++ ) {
 12         si (! st [i]) números primos [cnt ++] = i;
13          para ( int j = 0 ; primos [j] <= n / i; j ++ ) {
 14              st [primos [j] * i] = verdadero ;
15              Si (% primos i [j] == 0 ) descanso ;
16          }
 17      }
 18  }
 19  int main () {
 20      ll l, r;
21      , mientras que (cin >> l >> r) {
 22          get_primes (sqrt (r));
23          memset (rec, falso , sizeofREC);
 24          para (LL I = 0 ; I <CNT; I ++ ) {
 25              LL P = números primos [I];
 26 es              para (LL J = max ( 2 * P, (L + p- 1. ) / P * P ); J <= R & lt; J + = p) { // múltiple es mayor que la primera p-l, los dos casos,% p = 0 y p = 0%! 
27                  REC [JL] = true ;
 28              }
 29          }
 30          NUM = 0 ;
 31 es          para ( int I = 0 ; I <= RL es una; I ++ ) {
 32              IF (! REC [I] && I + L> . 1 ) //1不是质数特判
33                  pri [num ++] = i + l;
34          }
 35  
36          si (<num 2 ) puts ( " No hay números primos adyacentes. " );
37          otra cosa {
 38              int mx = 0 , Mn = 0 ;
39              para ( int i = 0 ; i <nú- 1 ; i ++ ) {
 40                  int d = pri [i + 1 ] - pri [i];
41                  si (d> pri [mx + 1 ] - pri [mx]) mx = i;
42                  si (d <pri [mn + 1 ] - pri [Mn]) mn = i;
43              }
 44              printf ( " % d,% d son los más cercanos,% d,% d son más distante \ n. " , Pri [Mn], pri [mn + 1 ], pri [mx], pri [mx + 1 ]);
45          }
 46      }
 47 }

 

Supongo que te gusta

Origin www.cnblogs.com/hhyx/p/12601890.html
Recomendado
Clasificación