1723 - Culegere 1

From Bitnami MediaWiki

Sursa: [1]

Cerinţa[edit | edit source]

O culegere de probleme are P pagini, numerotate de la 1 la P. Problemele din culegere sunt numerotate cu 1,2,3,...,etc, în ordinea apariţiei lor în culegere. Pe prima pagină a culegerii este scrisă o singură problemă (cea cu numărul 1). Pe a doua pagină sunt scrise exact două probleme (cele cu numerele 2 şi 3, în această ordine). Pe cea de-a treia pagină sunt scrise exact trei probleme (cele cu numerele 4, 5 şi 6, în această ordine),…, pe cea de a P-a pagină sunt scrise exact P probleme.

Scrieţi un program care citeşte numerele naturale P şi N şi determină valorile: a) T, numărul total de cifre care au fost utilizate în numerotarea tuturor problemelor din culegere; b) M, numărul minim de pagini pe care ar trebui să le aibă culegerea, astfel încât aceasta să conţină şi problema numerotată cu N.

Date de intrare[edit | edit source]

Programul conţine pe prima linie cele două numere naturale P şi N, separate printr-un spaţiu, cu semnificaţia din enunţ.

Date de ieșire[edit | edit source]

Programul conţine: pe prima linie numărul natural T, cu semnificaţia din enunţ; pe a doua linie numărul natural M, cu semnificaţia din enunţ.

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou afișează cerintele de mai sus.

Î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[edit | edit source]

1 ≤ P ≤ 16000 1 ≤ N ≤ 2112600000

Exemplul 1[edit | edit source]

Datele de intrare
5 9
Datele de ieșire
Datele sunt introduse corect.
21
4


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 1723

import math

def validate_input(p, n):

   if not 1 <= p <= 16000 or not 1 <= n <= 2112600000:
       return False
   return True

def solve(p, n):

   # calculate the total number of problems in the first P pages
   total_problems = sum(range(1, p+1))
   # calculate the number of pages needed to include problem N
   n_page = ((3 + 8 * (n - 1)) ** 0.5 - 1) // 2 + 1
   # calculate the total number of digits used to number all the problems in the collection
   total_digits = sum(len(str(i)) for i in range(1, total_problems + 1))
   # print the values of T and M
   print(total_digits)
   print(int(n_page))

if __name__ == '__main__':

   # read input values
   p, n = map(int, input().split())
   # validate input values
   if not validate_input(p, n):
       print("Datele nu corespund restricțiilor impuse.")
   else:
       print("Datele sunt introduse corect.")
       solve(p, n)

</syntaxhighlight>

Explicatie cod:

Acest cod implementează un algoritm care calculează numărul total de cifre folosite pentru a numerota toate problemele dintr-o carte de probleme și numărul de pagini necesare pentru a include o problemă dată, în funcție de numărul de probleme pe pagină și numărul problemei. Inputul constă din două numere întregi p și n, unde p reprezintă numărul de probleme pe pagină și n este numărul problemei căutate.

Funcția `validate_input` verifică dacă valorile p și n îndeplinesc restricțiile impuse. Dacă acestea nu sunt îndeplinite, se va returna `False`. Dacă valorile sunt corecte, se va returna `True`.

Funcția `solve` primește valorile validate și calculează numărul total de probleme în primele p pagini, numărul de pagini necesare pentru a include problema n și numărul total de cifre folosite pentru a numerota toate problemele din carte. Apoi, afișează numărul total de cifre și numărul de pagini necesare.

În secțiunea `__name__ == '__main__'`, se vor citi valorile de la intrare, apoi se vor valida și, dacă valorile sunt corecte, se va apela `solve` pentru a rezolva problema și a afișa rezultatele. Dacă valorile nu sunt corecte, se va afișa mesajul "Datele nu corespund restricțiilor impuse."