# PBinfo #4130 – rotire25 – Rezolvare C++

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

## Enunț

George a primit ca temă la matematică următoarea problemă. Se dă un număr X, asupra acestui număr se pot face următoarele transformări:

1) În această ordine (toți acești 3 pași reprezintă o transformare):


se înmulțește numărul cu 5 (de exemplu: X=416 devine 416*5=2080)
se elimină toate zerourile din număr (2080 devine 28)
se oglindește numărul (28 devine 82)

2) În această ordine  (toți acești 3 pași reprezintă o transformare):


se înmulțește numărul cu 2 (de exemplu: X=32 devine 32*2=64)
se elimină toate zerourile din număr (64 rămâne 64)
se oglindește numărul (64 devine 46)

George trebuie să aplice alternativ cele două transformări asupra numărului X. Prima dată aplică transformarea 1, apoi pe rezultatul obținut se aplică transformarea 2, apoi pe rezultat se aplică iar transformarea 1, apoi iar transformarea 2 și așa mai departe. George trebuie să aplice asupra numărului X exact K transformări, în ordinea descrisă mai sus.

Cerința
Dându-se numerele X și K determinaţi:
1) Produsul dintre ultima cifră a numărului X * X * X * ... * X (de K ori) şi prima cifră a lui X.
2) Numărul rezultat după aplicarea celor K transformări.

Date de intrare
Pe prima linie a fișierului de intrare rotire25.in se află trei numere separate prin câte un spațiu C, X și K. Dacă C=1 se va rezolva doar prima cerință, iar dacă C=2 se va rezolva doar a doua cerință. 

Date de ieșire
Fișierul de ieșire rotire25.out va conține un singur număr. Dacă C = 1, acest număr reprezintă rezultatul pentru prima cerinţă, iar dacă C = 2, acest număr reprezintă rezultatul pentru a doua cerință.

Restricții și precizări

1 ≤ X ≤ 999
1 ≤ K ≤ 1.000.000.000
Pentru teste în valoare de 29 de puncte, C = 1.
Pentru teste în valoare de 71 de puncte, C = 2.

Exemplul 1:
rotire25.in

1 27 3
rotire25.out

6
Explicație
Se rezolvă cerinţa 1: X = 27, K = 3. 27 * 27 * 27 = 19683 → ultima cifră este 3. Prima cifră a lui 27 este 2, deci rezultatul este 2 * 3 = 6

Exemplul 2:
rotire25.in

2 13 3
rotire25.out

551
Explicație
Se rezolvă cerinţa 2: X = 13, K = 3. Se fac urmatoărele transformări:


13 * 5 = 65, scoatem zerourile si rotim → 56
56 * 2 = 112, scoatem zerourile și rotim → 211
211 * 5 = 1055, scoatem zerourile → 155, rotim → 551

Exemplul 3:
rotire25.in

2 42 1782321
rotire25.out

12
Explicație
Se rezolvă cerinţa 2: X = 42, K = 1782321. După ce se fac cele K transformări se ajunge la numărul 12.

## Cod sursă C++

```cpp
#include <fstream>
using namespace std;
ifstream f("rotire25.in");
ofstream g("rotire25.out");
int c, x, k;
int main(){
	f >> c >> x >> k;
	if (c == 1){
		int first = x;
		while (first >= 10){
			first /= 10;
		}
		x %= 10;
		// perioada 1
		if (x == 0 || x == 1 || x == 5 || x == 6) {
			k = 1;
		}
		// perioada 2
		else if (x == 4 || x == 9) {
			k %= 2;
			if (k == 0) k = 2;
		}
		// perioada 4
		else {
			k %= 4;
			if (k == 0) k = 4;
		}
		int ans = x;
		for (int i=1;i<k;i++){
			ans = (ans * x) % 10;
		}
		g << ans * first << '\n';
	}
	else{
		int last1 = -1, last2 = -1;
		bool is_5 = true;
		while (x != last2 && k){
			last2 = last1; 
			last1 = x;
			// aplicam transformarea
			int p = (is_5 ? 5 : 2);
			x *= p;
			int ans = 0;
			while (x){
				if (x % 10){
					ans = ans * 10 + x % 10;
				}
				x /= 10;
			}
			x = ans;
			k--;
			is_5 = !is_5;
		}
		if (k % 2 == 1){
			int p = (is_5 ? 5 : 2);
			x *= p;
			int ans = 0;
			while (x){
				if (x % 10){
					ans = ans * 10 + x % 10;
				}
				x /= 10;
			}
			x = ans;
		}
		g << x << '\n';
	}
	return 0;
}
```

## Resurse

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