0976 - Sir 3

From Bitnami MediaWiki
Revision as of 15:47, 3 June 2024 by RebecaBud (talk | contribs) (Pagină nouă: == Enunt == Se consideră şirul de numere naturale ai cărui primi termeni sunt, în această ordine: 1, 5, 3, 7, 9, 11, 19, 17, 15, 13, 21,... Se grupează numerele din şir astfel: * prima grupă, numerotată cu 1, conţine primul termen al şirului (1) * a doua grupă, numerotată cu 2, conţine următorii doi termeni ai şirului (5,3) * a treia grupă, numerotată cu 3, conţine următorii trei termeni ai şirului (7,9,11) ………………………. * a n-a grupă din...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Enunt[edit | edit source]

Se consideră şirul de numere naturale ai cărui primi termeni sunt, în această ordine:

1, 5, 3, 7, 9, 11, 19, 17, 15, 13, 21,... Se grupează numerele din şir astfel:

  • prima grupă, numerotată cu 1, conţine primul termen al şirului (1)
  • a doua grupă, numerotată cu 2, conţine următorii doi termeni ai şirului (5,3)
  • a treia grupă, numerotată cu 3, conţine următorii trei termeni ai şirului (7,9,11)

……………………….

  • a n-a grupă din şir, numerotată cu n, conţine următorii n termeni ai şirului

etc.

Cerinţa[edit | edit source]

Deduceţi regula după care sunt generaţi termenii şirului şi scrieţi un program care să citească numerele naturale p, n şi k şi care să determine:

a) termenul de pe poziţia p din şirul din enunţ; b) cel mai mare număr natural palindrom care poate fi obţinut folosindu-se cifrele tuturor numerelor din grupa a n-a a şirului dat, nu neapărat toate aceste cifre; c) numărul grupei ce conţine un număr maxim de termeni şi are proprietatea că suma acestor termeni este cel mult egală cu k.

Date de intrare[edit | edit source]

Programul citește de la tastatură cele trei numere, p n k.

Date de ieșire[edit | edit source]

Programul va afișa pe ecran trei numere, reprezentând, în ordine:

  • termenul de pe poziţia p din şirul din enunţ;
  • cel mai mare număr natural palindrom care poate fi obţinut folosindu-se cifrele din scrierea zecimală a
  • tuturor termenilor din grupa a n-a a şirului dat, nu neapărat toate aceste cifre;
  • pe a treia linie se va scrie numărul grupei ce conţine un număr maxim de termeni şi are proprietatea că suma
  • acestora este cel mult egală cu k.

Restricţii şi precizări[edit | edit source]

  • Numerele p, n şi k sunt naturale
  • 1 ≤ p ≤ 1000000000
  • 1 ≤ n ≤ 50
  • 1 ≤ k ≤ 2000000000
  • un număr natural este palindrom dacă este egal cu numărul obţinut prin scrierea cifrelor sale în ordine inversă
  • Pentru rezolvarea cerinţei a) se acordă 40% din punctaj, pentru cerinţa b) 30% din punctaj şi pentru cerinţa c) 30% din punctaj.

Exemplul 1[edit | edit source]

Intrare

7 5 127

Ieșire

19 22922 5

Explicație[edit | edit source]

  • Primii 7 termeni ai şirului sunt: 1,5,3,7,9,11,19. Termenul căutat are valoarea 19.
  • Numerele din grupa a 5-a sunt scrise cu ajutorul a cinci cifre de 2, o cifră de 3, una de 5, una de 7, una de 9.
  • Cel mai mare palindrom care se poate scrie cu aceste cifre este 22922.
  • Grupele a căror sumă este cel mult egală cu k=127 sunt: 1,2,3,4,5. Grupa cu cei mai mulţi termeni şi cu suma maximă (=125) este grupa 5.


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> def generate_sequence(n):

   sequence = [1]
   current = 5
   for i in range(2, n + 1):
       sequence.extend(range(current, current + i))
       current += i + 1
   return sequence

def find_term(p, n):

   sequence = generate_sequence(n)
   return sequence[p - 1]

def is_palindrome(num):

   return str(num) == str(num)[::-1]

def find_largest_palindrome(numbers):

   palindromes = [int(str(num)[::-1]) for num in numbers if is_palindrome(num)]
   return max(palindromes)

def find_max_group(p, n, k):

   max_sum = 0
   max_group = 0
   sequence = generate_sequence(n)
   for i in range(1, n + 1):
       group = sequence[sum(range(i)) : sum(range(i + 1))]
       group_sum = sum(group)
       if group_sum <= k and len(group) > max_group:
           max_group = len(group)
           max_sum = group_sum
   return max_group

p, n, k = map(int, input().split())

  1. a)

term = find_term(p, n) print(term)

  1. b)

group_n = generate_sequence(n)[sum(range(n)): sum(range(n + 1))] largest_palindrome = find_largest_palindrome(group_n) print(largest_palindrome)

  1. c)

max_group = find_max_group(p, n, k) print(max_group)

</syntaxhighlight>