Cerința
Se dă un număr natural n
despre care se cunoaște că este putere de 2
. Considerăm inițial șirul numerelor naturale de la 1
la n
așezate în ordine crescătoare. Notăm cu A
acest șir. Pornind de la acesta, se construiește un nou șir (să îl notăm cu B
) astfel: Primele n
elemente ale lui B
sunt chiar elementele șirului A
în aceeași ordine. Următoarele n/2
elemente ale lui B
sunt ultimele n/2
elemente ale lui A
dar scrise în ordine inversă (descrescător). Următoarele n/4
elemente ale lui B
sunt ultimele n/4
elemente ale lui A
scrise în ordine crescătoare, următoarele n/8
elemente ale lui B
sunt ultimele n/8
elemente ale lui A
scrise în ordine descrescătoare, și tot așa, cu fiecare putere de 2
(notată p
) ce apare la numitor, luăm ultimele n/p
elemente din A
și le adăugăm la finalul lui B
alternând ordinea de parcurgere, de la o putere la alta conform modului descris mai sus. Se mai să un număr poz
. Se cere determinarea numărului de pe poziția poz
din șirul B
.
Date de intrare
Fișierul beta.in
conține pe prima linie numerele naturale n
și poz
separate printr-un spațiu.
Date de ieșire
Fișierul beta.out
conține valoarea cerută. Dacă șirul B
are mai puțin de poz elemente se va scrie în fișier -1
.
Restricții și precizări
1 ≤ n ≤ 1.000.000.000
n
se dă putere de2
1 ≤ poz ≤ 2.000.000.000
- Pentru
55
de puncte avemn ≤ 100.000
Exemplu
beta.in
8 13
beta.out
7
Explicație
Elementele șirului B
sunt, în ordine: 1 2 3 4 5 6 7 8 8 7 6 5 7 8 8
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema beta:
#include <fstream>
using namespace std;
ifstream fin ("beta.in");
ofstream fout("beta.out");
int n, poz, dir, len;
int main () {
fin>>n>>poz;
if (poz >= 2*n) {
fout<<-1;
return 0;
}
dir = 0;
len = n;
while (poz > len) {
poz -= len;
dir = 1-dir;
len /= 2;
}
if (dir == 0) {
fout<<n-len+poz;
} else {
fout<<n-poz+1;
}
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #3357 beta
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #3357 beta de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!