0955 - Miny

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.

Fie N un număr natural nenul şi N numere naturale nenule: x1, x2,…, xN.

Fie P produsul acestor N numere, P=x1•x2•...•xN.

Cerinţe

Scrieţi un program care să citească numerele N, x1, x2,…, xN şi apoi să determine:

a) cifra zecilor produsului P;

b) cel mai mic număr natural Y, pentru care există numărul natural K astfel încât YK=P.

Date de intrare

Fișierul de intrare input.txt conţine două linii. Pe prima linie este scris numărul natural N. Pe următoarea linie sunt scrise cele N numere naturale x1, x2,…, xN, separate prin câte un spaţiu.

Date de ieșire

Fișierul de ieșire output.txt va conține:

  • pe prima linie o cifră reprezentând cifra zecilor produsului P;
  • pe a doua linie numărul natural M de factori primi din descompunerea în factori primi a numărului Y;
  • pe fiecare dintre următoarele M linii (câte o linie pentru fiecare factor prim din descompunere) câte două valori F şi E, separate printr-un singur spaţiu, F reprezentând factorul prim iar E exponentul acestui factor din descompunerea în factori primi a lui Y; scrierea în fişier a acestor factori primi se va face în ordinea crescătoare a valorii lor.

Restricții și precizări

  • 2 ≤ N ≤ 50000

Exemplul 1

input.txt:

6

12 5 60 25 4 36

output.txt:

0

3

2 2

3 1

5 1

Explicație:

Produsul celor 6 numere este: P=12∙5∙60∙25∙4∙36=12960000.

Cifra zecilor lui P este 0.

Se observă că există 3 valori posibile pentru Y: 12960000, 3600 şi 60 deoarece: 129600001=12960000, 36002=12960000, 604=12960000.

Cea mai mică valoare dintre aceste valori este 60, astfel Y=60=(2**2)*3*5.

Exemplul 2

input.txt:

3

2 5 7

output.txt:

7

3

2 1

5 1

7 1

Explicație:

Produsul celor 3 numere este: P=2∙5∙7=70. Cifra zecilor lui P este 7. Există o singură valoare posibilă pentru Y: 70.

Exemplul 3

input.txt:

999999999999

2 5 7

Output:

Input-ul nu convine conditiilor

Rezolvare

def verificare(n):
    if not(2<=n<=5000):
        print("Input-ul nu convine conditiilor")
        exit()

def cmmdc(a, b):
    while a and b:
        if a > b:
            a = a % b
        else:
            b = b % a
    return a + b

n = 10000
v = [0] * (n + 1)
fr = [0] * (n + 1)
w = [0] * (n + 1)

# determinare numere prime <=10000 - Ciurul lui Eratostene
v[2] = 1
for i in range(3, n + 1, 2):
    v[i] = 1

for i in range(3, n + 1, 2):
    if v[i] != 0:
        for j in range(2 * i, n + 1, i):
            v[j] = 0

with open("input.txt", "r") as f, open("output.txt", "w") as g:
    N = int(f.readline())
    verificare(N)
    l=list(map(int, f.readline().split()))
    p = 1
    for i in range(N):
        x = l[i]
        fr[x] += 1
        p = (p * x) % 100

    for i in range(2, n + 1):
        if fr[i]:
            if v[i]:
                w[i] += fr[i]
            else:
                x = i
                for j in range(2, n + 1):
                    while v[j] and (x % j == 0) and x > 1:
                        w[j] += fr[i]
                        x //= j

    M = 0
    d = 0
    for i in range(2, n + 1):
        if w[i]:
            M += 1
            d = cmmdc(d, w[i])

    g.write(f"{p // 10}\n{M}\n")
    for i in range(2, n + 1):
        if w[i]:
            g.write(f"{i} {w[i] // d}\n")