2934 - Cmmp
Cerința[edit | edit source]
Pentru orice număr natural x definim operația cmmp prin care adăugăm cifre la stânga lui x, la dreapta lui x sau la ambele capete ale lui x, astfel încât numărul obținut să fie pătrat perfect și cât mai mic posibil. Se dau N numere naturale s1,s2…sN .
Să se determine pentru fiecare număr s[k], 1 ≤ k ≤ N, cel mai mic pătrat perfect care se poate obține prin aplicarea operației cmmp.
Date de intrare[edit | edit source]
Fișierul de intrare cmmp.in conține pe primul rând numărul N. Pe linia a doua sunt scrise N numere naturale separate prin câte un spațiu.
Date de ieșire[edit | edit source]
În fișierul de ieșire cmmp.out vor fi scrise, în ordinea corespunzătoare citirii și separate prin câte un spațiu, cele N numere obținute din numerele date prin aplicarea operației cmmp.
Restricții și precizări[edit | edit source]
- 1 ≤ N ≤ 100.000
- 0 ≤ s[k] < 100.000
- Pentru 20% din teste 0 ≤ s[k] < 100
- Pentru 20% din teste 0 ≤ s[k] < 1000
- Dacă numărul dat este pătrat perfect, atunci operația cmmp îl lasă neschimbat.
Exemplu 1[edit | edit source]
- Intrare
4
21 0 19 80
- Iesire
121 0 196 2809
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line> import math
def is_perfect_square(x):
"""Verifică dacă un număr este pătrat perfect.""" s = int(math.isqrt(x)) return s * s == x
def cmmp_operation(x):
"""Aplică operația cmmp pentru a obține cel mai mic pătrat perfect.""" if is_perfect_square(x): return x x_str = str(x) min_perfect_square = float('inf') for i in range(10): for j in range(10): for k in range(10): possible_numbers = [ int(str(i) + x_str), int(x_str + str(j)), int(str(i) + x_str + str(j)), int(str(k) + str(i) + x_str + str(j)), ] for num in possible_numbers: if is_perfect_square(num): min_perfect_square = min(min_perfect_square, num) return min_perfect_square if min_perfect_square != float('inf') else x
def main():
with open('cmmp.in', 'r') as f: data = f.read().splitlines()
N = int(data[0].strip()) numbers = list(map(int, data[1].strip().split())) assert 1 <= N <= 100000, "N trebuie să fie între 1 și 100000" assert all(0 <= x <= 100000 for x in numbers), "Numerele trebuie să fie între 0 și 100000"
results = [cmmp_operation(num) for num in numbers]
with open('cmmp.out', 'w') as f: f.write(' '.join(map(str, results)) + '\n')
if __name__ == "__main__":
main()
</syntaxhighlight>