1125 - Overflow 2

De la Universitas MediaWiki

Cerința

După ce Gigel a rezolvat problema anterioară ( #Overflow ), profesorul nu a fost foarte mulțumit de metoda sa. Așadar, i-a dat următoarea problemă: se dau n numere naturale. Să se afle dacă numerele pot fi reprezentate pe 8 octeți, fără semn.

Date de intrare

Programul citește de la tastatură numărul n. Pe următoarele n rânduri se vor afla numerele m, urmate de m perechi de numere a b, cu semnificația de mai sus.

Date de ieșire

Programul va afișa pe ecran pentru fiecare din cele n cazuri rezultatul dacă numărul se încadrează în tipuri de date de 8 octeți, sau Overflow! în caz contrar.

Restricții și precizări

  • 1 ⩽ n*m ⩽ 1.000.000
  • 0 ⩽ b ⩽ 64
  • a+b ≠ 0

Exemplul 1

Intrare
4
1 2 63
1 2 64
1 666013 2
2 2 63 2 62
Ieșire
Datele de intrare corespund restricțiilor impuse
Datele de intrare corespund restricțiilor impuse
Datele de intrare corespund restricțiilor impuse
Datele de intrare corespund restricțiilor impuse
9223372036854775808
Overflow!
443573316169
13835058055282163712

Explicație

2^64 = 18.446.744.073.709.551.616, care nu poate fi reprezentat pe 8 octeți.

Exemplul 2

Intrare
4
1 0 0
1 2 64
1 666013 2
2 2 62 2 63
Ieșire
Datele de intrare corespund restricțiilor impuse
Datele de intrare NU corespund restricțiilor impuse

Rezolvare

#1125 - Overflow2

def este_rezultat_valid(rezultat):
    max_intreg_fara_semn_64 = 2 ** 64 - 1
    return 0 <= rezultat <= max_intreg_fara_semn_64


def sunt_date_intrare_valide(n, m, perechi):
    if 1 <= n * m <= 1000000:
        print("Datele de intrare corespund restricțiilor impuse")
    else:
        print("Datele de intrare NU corespund restricțiilor impuse")
        exit(0)

    for i in range(0, 2 * m, 2):
        a, b = perechi[i], perechi[i + 1]
        if not (0 <= a <= 18446744073709551615) or not (0 <= b <= 64) or (a + b == 0):
            print("Datele de intrare NU corespund restricțiilor impuse")
            exit(0)
    return True


def calculeaza_suma(n, date):
    rezultate = []

    for i in range(n):
        m, *perechi = map(int, date[i])

        if sunt_date_intrare_valide(n, m, perechi):
            suma_totala = 0
            for j in range(0, 2 * m, 2):
                a, b = perechi[j], perechi[j + 1]
                suma_totala += a ** b

            if este_rezultat_valid(suma_totala):
                rezultate.append(suma_totala)
            else:
                rezultate.append("Overflow!")

    return rezultate


def main():
    n = int(input())
    date_intrare = [list(map(int, input().split())) for _ in range(n)]

    rezultate = calculeaza_suma(n, date_intrare)

    for rezultat in rezultate:
        print(rezultat)


if __name__ == "__main__":
    main()