2934 - Cmmp

De la Universitas MediaWiki

Cerința

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

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

Î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

  • 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

Intrare

4
21 0 19 80

Iesire

121 0 196 2809

Rezolvare

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()