Revizia anterioară Revizia următoare
Fişierul intrare/ieşire: | sieve.in, sieve.out | Sursă | ACM-ICPC Faza Nationala 2017 |
Autor | Mihai Calancea | Adăugată de | |
Timp execuţie pe test | 0.5 sec | Limită de memorie | 131072 kbytes |
Scorul tău | N/A | Dificultate | N/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.in | sieve.out |
---|---|
2 9 250 | 5.5 577.8554834 |