# PBinfo #2448 – patrate3 – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: deivid

## Enunț

Un elev a desenat un set format din mai multe pătrate care conțin numere naturale nenule, distincte, consecutive, dispuse în număr egal pe laturi. Pe latura fiecărui pătrat sunt scrise un număr impar de valori. În fiecare pătrat, numerele sunt scrise în ordine crescătoare parcurgând laturile sale, începând din colțul stânga-jos, în sensul invers al acelor de ceasornic. Elevul a numerotat pătratele cu 1, 2, 3 etc., în ordinea strict crescătoare a numărului de valori conținute de fiecare. Diferența dintre cel mai mic număr din pătratul P (1 < P) și cel mai mare număr din pătratul P - 1 este egală cu 1. Primele patru pătrate sunt:



Astfel, primul pătrat conține numerele naturale distincte consecutive de la 1 la 8, dispuse câte trei pe fiecare latură a pătratului. Al doilea pătrat conține următoarele 16 numere naturale distincte consecutive, dispuse câte cinci pe fiecare latură. Al treilea pătrat conține următoarele 24 de numere naturale distincte consecutive, dispuse câte șapte pe fiecare latură. Al patrulea pătrat conține următoarele 32 de numere naturale distincte consecutive, dispuse câte nouă pe fiecare latură etc.

Cerința
Scrieţi un program care rezolvă următoarele două cerinţe:
1. citește un număr natural M și determină numărul K de valori conținute de pătratul numerotat cu M;
2. citește un număr natural N și determină numărul T al pătratului care conține numărul N pe una dintre laturi.

Date de intrare
Fișierul de intrare patrate3.in conține pe prima linie un număr natural C reprezentând cerința din problemă care trebuie rezolvată (1 sau 2). Dacă C = 1, atunci fişierul conține pe a doua linie numărul natural M. Dacă C = 2, atunci fișierul conține pe a doua linie numărul natural N.

Date de ieșire
Dacă C = 1, atunci fişierul de ieşire patrate3.out conţine pe prima linie numărul K, reprezentând răspunsul la cerința 1 a problemei. Dacă C = 2, atunci fişierul de ieşire patrate3.out conţine pe prima linie numărul natural T, reprezentând răspunsul la cerinţa 2.

Restricții și precizări

1 ≤ M ≤ 260 000 000
7 ≤ N ≤ 2 147 302 920
Numerele N, M, T și K sunt numere naturale
NU există două pătrate cu acelaşi număr de valori scrise pe laturi
Pentru rezolvarea corectă a cerinţei 1 se acordă 10 puncte; pentru rezolvarea corectă a cerinței 2 se acordă 80 de puncte.
În concurs s-au acordat 10 puncte din oficiu. Aici se acordă 10 puncte pentru exemplele din enunț.

Exemplul 1:
patrate3.in

1
3
patrate3.out

24
Explicație
Cerinţa este 1. Pătratul numerotat cu M = 3 conține K = 24 de numere naturale (vezi figura din enunț).

Exemplul 2:
patrate3.in

2
73
patrate3.out

4
Explicație
Cerinţa este 2. Numărul N = 73 este conținut de pătratul numerotat cu T = 4 (vezi figura din enunț).

## Cod sursă C++

```cpp
#include <fstream>
using namespace std;
ifstream f("patrate3.in");
ofstream g("patrate3.out");
int main()
{
    int N,C,M,T,K,nr=0;
    f>>C;
    if(C==1)
    {
        f>>M;
        K=8*M;
        g<<K<<endl;
    }
    else
    {
        f>>N;
        T=0;nr=0;
        while(8*(T+1)<=N-nr)
            {
                ++T; K=8*T; nr=nr+K;
            }
        if(N>nr)
        {
            ++T;
        }
        g<<T<<endl;
    }
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/2448)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/2448/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-2448/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
