Solução Informática – Iniciante – Semana 38

por

Solução escrita por João Pedro Castro

Sabemos que $$X$$ pode ser escrito como $$10 \cdot Y + Z$$, sendo $$Z$$ o algarismo na casa das unidades de $$X$$ (basicamente estamos adicionando um $$0$$ ao fim de $$Y$$ e adicionando um algarismo $$Z$$, o que troca o $$0$$ por esse algarismo). Portanto:

$$10 \cdot Y + Z + Y = N$$  $$\implies$$ $$11 \cdot Y + Z = N$$  $$\implies$$ $$11 \cdot Y = N – Z$$ $$\implies$$ $$Y = \frac{N – Z}{11}$$

O problema pede que $$Y$$ seja um inteiro, logo $$N – Z$$ é necessariamente divisível por 11. Felizmente existe uma função matemática que determina o quanto você precisa subtrair de um número positivo para ele ser divisível por outro, a função módulo. Portanto, $$Z = (N \bmod 11)$$. Como $$Z$$ é um algarismo $$0 \leq Z \leq 9$$, logo se $$Z = 10$$ não existe solução (podemos imprimir -1). Agora que sabemos o valor de $$Z$$ e que existe uma solução, é só seguir a fórmula que achamos anteriormente para $$Y$$. E como a fórmula de $$X$$ só depende de $$Y$$ e $$Z$$ (2 valores que já calculamos), também é só seguir a definição anterior para fechar a questão.

Como a complexidade para cada caso de teste é $$O(1)$$, podemos afirmar que a complexidade final é de $$O(T)$$, o que nos garante um AC com tranquilidade. Segue o código abaixo para melhor compreensão.


#include <bits/stdc++.h>
using namespace std;
int main() {
int t;
cin >> t;
while(t–) {
int n;
cin >> n;
int z = n % 11;
if (z > 9) {
cout << -1 << "\n";
} else {
int y = n/11; // podemos fazer isso pois o C++ arredonda o valor pra baixo automaticamente
int x = 10*y+z;
cout << x << " " << y << "\n";
}
}
}