2229 - numere20

De la Universitas MediaWiki

Enunt

Ionel are de rezolvat mai multe probleme de divizibilitate. Unele dintre ele îi cer să afle câte numere au anumite proprietăţi. Vă rugăm să-l ajutaţi să termine tema mai repede.

Cerința

Scrieţi un program care citeşte un număr natural n şi două numere prime u şi v mai mici decât 10 şi determină câte numere naturale mai mici sau egale cu n au proprietatea că nu sunt divizibile nici cu u, nici cu v.

Date de intrare

Fișierul de intrare numere20.in conţine pe prima linie numărul natural n şi cifrele u şi v, separate prin câte un spaţiu.

Date de ieșire

Fișierul de ieșire numere20.out va conţine o singură linie pe care va fi scris numărul de numere naturale mai mici sau egale cu n care nu sunt divizibile nici cu u, nici cu v. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse".

Restricții și precizări

  • Numărul natural n are cel mult 100 de cifre

Exemplul 1:

numere20.in

30  3  7

numere20.out

17

Explicație

Numerele care au proprietatea din enunţ sunt: 1, 2, 4, 5, 8, 10, 11, 13, 16, 17, 19, 20, 22, 23, 25, 26, 29.

Exemplul 2:

numere20.in

30  3  7

numere20.out

Datele nu corespund restrictiilor impuse

Rezolvare

LG = 1001

def Set(a, x):
    n = len(x)
    a[0] = n
    for i in range(1, n + 1):
        a[i] = int(x[n - i])

def copie(A, B):
    A[:LG] = B[:LG]

def scrie(a):
    with open("numere20OUT.txt", "w") as g:
        for i in range(a[0], 0, -1):
            g.write(str(a[i]))
        g.write('\n')

def verifica_restrictii(n, u, v):
    if n[0] > 100 or u > 100 or v > 100:
        with open("numere20OUT.txt", "w") as g:
            g.write("Datele nu corespund restrictiilor impuse\n")
        return False
    return True

def suma(A, B, C):
    r, s = 0, 0
    C[:LG] = A[:LG]
    if A[0] > B[0]:
        C[0] = A[0]
    else:
        C[0] = B[0]
    i = 1
    while i <= B[0]:
        s = C[i] + B[i] + r
        r = s // 10
        C[i] = s % 10
        i += 1
    while r:
        s = C[i] + r
        r = s // 10
        C[i] = s % 10
        i += 1
    if i - 1 > C[0]:
        C[0] += 1

def dif(A, B, C):
    C[:LG] = A[:LG]
    i = 1
    while i <= C[0]:
        if C[i] >= B[i]:
            C[i] -= B[i]
        else:
            j = i + 1
            while C[j] == 0:
                C[j] = 9
                j += 1
            C[j] -= 1
            C[i] += 10 - B[i]
        i += 1
    i = C[0]
    while i > 1 and C[i] == 0:
        i -= 1
    C[0] = i

def divide_mare_mic(a, b, c):
    x, i, j = 0, a[0], 0
    y = [0] * LG
    while x < b and i > 0:
        x = x * 10 + a[i]
        i -= 1
    x = x // 10
    i += 1
    while i > 0:
        x = x * 10 + a[i]
        y[j] = x // b
        x = x % b
        i -= 1
        j += 1
    if j == 0:
        c[0] = 1
        c[1] = 0
    else:
        c[0] = j
        for i, k in enumerate(range(j - 1, -1, -1), start=1):
            c[i] = y[k]

def main():
    nn, u, v = f.readline().split()
    u, v = int(u), int(v)
    n, nr1, nr2, nr3, nr4, nr5, nr = [0] * LG, [0] * LG, [0] * LG, [0] * LG, [0] * LG, [0] * LG, [0] * LG
    Set(n, nn)

    if not verifica_restrictii(n, u, v):
        return

    divide_mare_mic(n, u, nr1)
    divide_mare_mic(n, v, nr2)
    suma(nr1, nr2, nr3)
    divide_mare_mic(n, u * v, nr4)
    dif(nr3, nr4, nr5)
    dif(n, nr5, nr)
    scrie(nr)

if __name__ == "__main__":
    with open("numere20IN.txt", "r") as f:
        main()