Atenţie! Aceasta este o versiune veche a paginii, scrisă la 2017-05-27 14:55:11.
Revizia anterioară   Revizia următoare  

 

Fişierul intrare/ieşire:sieve.in, sieve.outSursăACM-ICPC Faza Nationala 2017
AutorMihai CalanceaAdăugată deklamathixMihai Calancea klamathix
Timp execuţie pe test0.5 secLimită de memorie131072 kbytes
Scorul tăuN/ADificultateN/A

Vezi solutiile trimise | Statistici

Sieve

//Povestea va fi schimbata

In aceasta problema vom analiza cum se comporta Ciurul lui Eratosthene daca in loc sa parcurgem numerele in ordinea {2, 3, 4, .. N}, le parcurgem in ordinea data de o permutare aleatoare a acestor numere. Mai exact, dandu-se acest pseudocod:

int countSteps(int n, vector<int> p) {
    vector<bool> Composite(n + 1, false);
    int steps = 0;

    // p este o permutare a multimii {2, 3, ..., n}

    for(int index = 0; index < n - 1; ++index) {
        if(not Composite[p[index]]) {
            for(int multiple = 2 * p[index]; multiple <= n; multiple += p[index]) {
                Composite[multiple] = true;
                steps += 1;
            }
        }
    }

    return steps;
}

int identity = countSteps(8, {2, 3, 4, 5, 6, 7, 8});
int misplaced_four = countSteps(8, {4, 2, 3, 5, 6, 7, 8});

//identity are valoarea 4, iar misplaced_four are valoarea 5.

Ne intrebam care este valoarea medie intoarsa de functia countSteps() daca permutarea p este generata aleator si uniform.

Date de intrare

Fişierul de intrare sieve.in va contine pe prima sa linie numarul T reprezentand numarul de teste. Urmatoarele T teste contin cate o valoare N.

Date de ieşire

În fişierul de ieşire sieve.out se vor afla T linii, fiecare continand cate un numar real, reprezentand raspunsul pentru testul corespunzator.

Restricţii

  • 1 ≤ N ≤ 100.000
  • 1 ≤ T ≤ 100.000

Exemplu

sieve.insieve.out
1
250
577.8554834
Trebuie sa te autentifici pentru a trimite solutii. Click aici

Cum se trimit solutii?