1723 - Culegere 1

From Bitnami MediaWiki
Revision as of 08:44, 29 April 2023 by Sinn Erich (talk | contribs) (→‎Rezolvare)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Sursa: [1]

Cerinţa

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

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

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

1 ≤ P ≤ 16000 1 ≤ N ≤ 2112600000

Exemplul 1

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


Rezolvare

<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."