2351 - Numere 23: Diferență între versiuni

De la Universitas MediaWiki
(Pagină nouă: ==Cerința== Se numește număr 3-prim, un număr natural care se poate descompune în produs de cel mult <code>3</code> numere prime, nu neapărat distincte. Cunoscând numerele naturale <code>n</code> și <code>k</code>, construiți un șir format din primele <code>n</code> numere 3-prime. Ordinea numerelor în șir va fi stabilită astfel încât, extrăgând pe rând numerele din șir, începând cu primul număr și apoi câte un număr din <code>k</code> în <code>k</co...)
 
Fără descriere a modificării
Linia 11: Linia 11:
Fișierul de intrare <code>numere23.in</code> conţine pe prima linie, despărțite prin câte un spațiu, numerele naturale <code>n</code>, <code>k</code> și <code>c</code>, cu semnificaţia din enunţ.
Fișierul de intrare <code>numere23.in</code> conţine pe prima linie, despărțite prin câte un spațiu, numerele naturale <code>n</code>, <code>k</code> și <code>c</code>, cu semnificaţia din enunţ.
==Date de ieșire==
==Date de ieșire==
Dacă <code>c = 1</code>, atunci pe prima linie a fişierului <code>numere23.out</code> va fi scris un singur număr ce reprezintă cel mai mare din cele <code>n</code> numere 3-prime. Dacă <code>c = 2</code>, atunci fişierul <code>numere23.out</code> va conţine despărțite prin câte un spațiu, șirul celor <code>n</code> numere 3-prime.
Pe ecran se va afișa mesajul: "Datele de intrare corespund restricțiilor impuse."
 
Dacă <code>c = 1</code>, atunci pe următorul rând se va afișa un singur număr ce reprezintă cel mai mare din cele <code>n</code> numere 3-prime. Dacă <code>c = 2</code>, atunci se vor afișa despărțite prin câte un spațiu, șirul celor <code>n</code> numere 3-prime.
 
În cazul în care datele introduse de la tastatură nu îndeplinesc cerințele enunțate, pe ecran se va afișa mesajul "Datele de intrare nu corespund restricțiilor impuse."
==Restricții și precizări==
==Restricții și precizări==


Linia 106: Linia 110:


     if not conditii(k, n):
     if not conditii(k, n):
         return print("Date de intrare gresite!")
         return print("Datele de intrare nu corespund restricțiilor impuse.")
    print("Datele de intrare corespund restricțiilor impuse.")


     if c == 1:
     if c == 1:

Versiunea de la data 26 martie 2023 10:39

Cerința

Se numește număr 3-prim, un număr natural care se poate descompune în produs de cel mult 3 numere prime, nu neapărat distincte. Cunoscând numerele naturale n și k, construiți un șir format din primele n numere 3-prime. Ordinea numerelor în șir va fi stabilită astfel încât, extrăgând pe rând numerele din șir, începând cu primul număr și apoi câte un număr din k în k poziții, circular, să obținem în ordine crescătoare, șirul primelor n numere 3-prime. Parcurgerea circulară înseamnă că după elementul aflat în vector pe locul n, urmează elementul de pe locul 1.

Cunoscând numerele n, k și c (c = 1 sau c = 2), se cere:

1. dacă c = 1, să se afișeze cel mai mare din cele n numere 3-prime.

2. dacă c = 2, să se construiască șirul de n numere care îndeplinește condiția din enunț.

Date de intrare

Fișierul de intrare numere23.in conţine pe prima linie, despărțite prin câte un spațiu, numerele naturale n, k și c, cu semnificaţia din enunţ.

Date de ieșire

Pe ecran se va afișa mesajul: "Datele de intrare corespund restricțiilor impuse."

Dacă c = 1, atunci pe următorul rând se va afișa un singur număr ce reprezintă cel mai mare din cele n numere 3-prime. Dacă c = 2, atunci se vor afișa despărțite prin câte un spațiu, șirul celor n numere 3-prime.

În cazul în care datele introduse de la tastatură nu îndeplinesc cerințele enunțate, pe ecran se va afișa mesajul "Datele de intrare nu corespund restricțiilor impuse."

Restricții și precizări

  • 0 < k < n ≤ 10000
  • numerotarea elementelor în vector se face de la 1

Exemplu 1

Intrare
5 3 2
Ieșire
2 6 4 3 5

Explicație

Primele cinci numere 3-prime sunt: 2, 3, 4, 5, și 6. Șirul de numere 2, 6, 4, 3, 5 parcurs din 3 în 3, va forma în ordine crescătoare șirul de numere inițial.

Exemplu 2

Intrare
10 4 2
Ieșire
2 11 10 5 3 8 7 9 4 6

Explicație

Primele 10 numere 3-prime sunt: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Șirul de numere 2, 11, 10, 5, 3, 8, 7, 9, 4, 6, parcurs din 4 în 4, va forma în ordine crescătoare șirul de numere inițial.

Exemplu 3

Intrare
5 3 1
Ieșire
6

Explicație

Primele 10 numere 3-prime sunt: 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Șirul de numere 2, 11, 10, 5, 3, 8, 7, 9, 4, 6, parcurs din 4 în 4, va forma în ordine crescătoare șirul de numere inițial.

Exemplu 4

Intrare
3 10 1
Ieșire
Date de intrare gresite!

Rezolvare

#2351 Numere 23

def prim3(n):
    if n < 2:
        return False
    d, nr = 2, 0
    while n != 1 and nr <= 3:
        while n % d == 0 and nr <= 3:
            n //= d
            nr += 1
        d += 1
    if n == 1 and nr <= 3:
        return True

    return False


def cel_mai_mare(n):
    res = 1
    while n > 0:
        res += 1
        if prim3(res):
            n -= 1

    return res


def sir_circular(n, k):
    val, poz, nr_n = 1, 1, n
    while not prim3(val):
        val += 1
    vector = [0] * (n + 1)
    vector[1] = val
    nr_n -= 1

    while nr_n > 0:
        val += 1
        while not prim3(val):
            val += 1
        nr_k = k
        while nr_k > 0:
            poz += 1
            if poz > n:
                poz = poz % n
            if vector[poz] == 0:
                nr_k -= 1
        vector[poz] = val
        nr_n -= 1

    return " ".join(str(x) for x in v[1:])


def conditii(k, n):
    return 0 < k < n <= 10_000


def main():
    n, k, c = map(int, input().split())

    if not conditii(k, n):
        return print("Datele de intrare nu corespund restricțiilor impuse.")
    print("Datele de intrare corespund restricțiilor impuse.")

    if c == 1:
        print(cel_mai_mare(n))
    elif c == 2:
        print(sir_circular(n, k))


if __name__ == "__main__":
    main()