Cerința
Macaraie, pasionat de numere, dar mai ales de matrici, începe într-o zi să umple o foaie infinită de matematică cu numere astfel: în colțul aflat în stânga sus (de coordonate (1, 1)
) pune 0
, apoi scrie de la stânga la dreapta și de sus în jos cel mai mic număr care nu apare pe linia și coloana respectivă. Dându-se linia și coloana unei căsuțe din tabelă, aflați numărul de la acea poziție.
Date de intrare
Fișierul de intrare tabela.in
conține pe prima și singura linie numerele L
și C
, reprezentând linia și coloana pătrățelului a cărui valoare dorim să o determinăm.
Date de ieșire
Fișierul de ieșire tabela.out
conține pe prima linie numărul scris pe foaie la linia L
si coloana C
.
Restricții și precizări
1 ≤ L, C ≤ 2.000.000.000
Notă importantă
Această problemă a fost portată de pe Infoarena și are alte teste de evaluare! Acestea nu au fost accesibile la momentul portării problemei pe Pbinfo, motiv pentru care au fost înlocuite.
Exemplu
tabela.in
2 3
tabela.out
3
tabela.in
4 5
tabela.out
7
Explicație
0 1 2 3 4 5 .. 1 0 3 2 5 4 .. 2 3 0 1 6 7 .. 3 2 1 0 7 6 .. ..............
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 Tabela:
// ===========================
// = Solutie neoficiala =
// = Vintila Valentin Ioan =
// ===========================
#include <bits/stdc++.h>
using namespace std;
long long f(long long l, long long c, long long cadran)
{
if(cadran == 1)
return 0;
if(l <= cadran / 2 && c <= cadran / 2)
return f(l, c, cadran/2);
else if(l > cadran / 2 && c > cadran / 2)
return f(l-cadran / 2, c - cadran / 2, cadran/2);
else if(l <= cadran / 2 && c > cadran / 2)
return f(l, c-cadran/2, cadran/2) + cadran/2;
else
return f(l-cadran/2, c, cadran/2) + cadran/2;
}
int main()
{
ifstream fin("tabela.in");
ofstream fout("tabela.out");
long long l, c, l2, c2, cadran;
fin >> l >> c;
l2 = (long long)1 << ((long long)log2((double)l-1) + 1);
c2 = (long long)1 << ((long long)log2((double)c-1) + 1);
cadran = max(l2, c2);
fout << f(l, c, cadran);
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 #2869 Tabela
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2869 Tabela 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!