2213 - Sir Div K

De la Universitas MediaWiki

Enunț

Cu ajutorul a trei cifre date a, b, c, unde a > 0, se construieşte următorul şir de numere: a,ab,abc,abca,abcab,abcabc,… . De exemplu, pentru a=1, b=3, c=7, putem construi şirul: 1,13,137, 1371,13713, 137137, 1371371, 13713713, ...

Cerinţa

Scrieţi un program care determină câte numere divizibile cu k se găsesc în primii n termeni ai şirului dat.

Date de intrare

Fișierul de intrare sirdivk.in conține pe prima linie numerele a b c n k.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe urmatorul rand fișierul de ieșire sirdivk.out conţine o singură linie pe care este scris numărul nr de numere divizibile cu k aflate printre primii n termeni ai şirului dat. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse.".

Restricţii şi precizări

  • 1 < n < 1000
  • 2 ⩽ k < 32000
  • 1 ⩽ a ⩽ 9, 0 ⩽ b,c ⩽ 9

Exemplu

sirdivk.in
7 2 1 8 3
sirdivk.out
Datele sunt introduse corect.
2

Explicație

Printre primii 8 termeni ai şirului: 7, 72, 721, 7217, 72172, 721721, 7217217, 72172172,... există doi termeni divizibili cu 3.

Rezolvare

def validare_date(a, b, c, n, k):
    # Verificăm dacă toate valorile de intrare respectă restricțiile
    if not(1 < n < 1000) or not(2 <= k < 32000) or not(0 <= b <= 9) or not(0 <= c <= 9) or not(1 <= a <= 9):
        return False
    else:
        return True

if __name__ == '__main__':
    # Deschidem fișierul de intrare și citim valorile de intrare
    with open("sirdivk.in", "r") as f_in:
        a, b, c, n, k = map(int, f_in.readline().split())

    # Verificăm dacă valorile de intrare sunt valide
    if not validare_date(a, b, c, n, k):
        # Scriem un mesaj de eroare în fișierul de ieșire și ieșim din program
        with open("sirdivk.out", "w") as f_out:
            f_out.write("Datele nu corespund restricțiilor impuse.")
        exit()
    else:
        # Secvența de operații pe care o vom efectua dacă valorile de intrare sunt valide
        numar = [a] * n
        for i in range(1, n):
            if i % 3 == 1:
                numar[i] = b
            elif i % 3 == 2:
                numar[i] = c

        rest = 0
        gasite = 0
        for i in range(n):
            rest = rest * 10 + numar[i]
            if rest % k == 0:
                gasite += 1
            rest %= k

        # Scriem rezultatul în fișierul de ieșire
        with open("sirdivk.out", "w") as f_out:
            f_out.write("Datele sunt introduse corect.\n")
            f_out.write(str(gasite))