2934 - Cmmp

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

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