acwing mejorar la plantilla de clase de matemáticas

plantilla matemática

número primo tamiz

Primer 筛

AcWing 196. primos distancia
Dados dos números enteros L y U, que necesita el intervalo cerrado [L, el U-] para encontrar la distancia más cercana de dos primos adyacentes C1 y C2 (es decir, C2-C1 es el más pequeño), si está presente, otra vecina ceba la misma distancia, la salida de la primera pareja.

Al mismo tiempo, también es necesario para encontrar la mayoría de los dos números primos lejanos adyacentes D1 y D2 (es decir, D1-D2 es el más grande), la presencia de otro número primo adyacentes si la misma distancia, la salida del primer par.

Entrada: cada línea de entrada dos enteros L y U, U y L, en el que la diferencia no excede de 1.000.000.

Salida: Para cada uno de los L y U, salida a un resultado, uno Resultados de fila.

Los resultados incluyen el número del vecino más cercano y más lejano de la calidad de pares de números primos adyacentes. (Consulte el formato específico de la muestra)

Si no hay un número entre L y T calidad en la salida "Hay números primos no adyacentes.".

1≤L <U≤231-1

Título dado L, rango r es particularmente grande, no puede ser determinado directamente número primo [L, r] en, hemos encontrado que cualquier número compuesto n, ciertamente comprende un no más de \ (\ sqrt {n} \ ) de primordial. Por lo tanto, de acuerdo a esta propiedad, sólo tenemos que ~ 2 \ (\ R ^ sqrt {} \) todos los números primos entre sí. Luego, para cada número primo p, podemos marcar i * p es un número compuesto ( \ (\ frac {L p}} {\) ≤i≤ \ (\ R ^ {p} FRAC} {\) ), pero donde p no es 1, a sentencia especial.

typedef long long LL;
const int N = 1000010;
int primes[N], cnt;
bool st[N];
void init(int n) {
    memset(st, 0, sizeof st);
    cnt = 0;
    for (int i = 2; i <= n; i ++ ) {
        if (!st[i]) primes[cnt ++ ] = i;
        for (int j = 0; primes[j] * i <= n; j ++ ) {
            st[i * primes[j]] = true;
            if (i % primes[j] == 0) break;
        }
    }
}
int main() {
    int l, r;
    while (cin >> l >> r) {
        init(50000);
        memset(st, 0, sizeof st);
        for (int i = 0; i < cnt; i ++ ) {
            LL p = primes[i];
            //枚举l到r中最小的p的倍数,但倍数最小为2 
            for (LL j = max(p * 2, (l + p - 1) / p * p); j <= r; j += p)
                st[j - l] = true;//偏移量 
        }
        cnt = 0;
        for (int i = 0; i <= r - l; i ++ )
            if (!st[i] && i + l >= 2)
                primes[cnt ++ ] = i + l;
        if (cnt < 2) puts("There are no adjacent primes.");
        else {
            int minp = 0, maxp = 0;
            for (int i = 0; i + 1 < cnt; i ++ ) {
                int d = primes[i + 1] - primes[i];
                if (d < primes[minp + 1] - primes[minp]) minp = i;
                if (d > primes[maxp + 1] - primes[maxp]) maxp = i;
            }
            printf("%d,%d are closest, %d,%d are most distant.\n",
                   primes[minp], primes[minp + 1],
                   primes[maxp], primes[maxp + 1]);
        }
    }
    return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/QingyuYYYYY/p/12460554.html
Recomendado
Clasificación