2013 - Intersectie Segmente: Difference between revisions

From Bitnami MediaWiki
No edit summary
No edit summary
 
Line 1: Line 1:
Numerele naturale nenule se scriu pe linii într-un triunghi de forma de mai jos:
1
2 3
4 5 6
7 8 9 10
...
== Cerinţa ==
== Cerinţa ==
Se dau două numere natural '''n''' și '''m'''. Determinați:
Se dau două numere natural '''n''' și '''m'''. Determinați:
Line 16: Line 22:
Fișierul de ieșire '''numere18out.txt''' va conține o singură linie. Dacă '''C=1''', va fi scrisă suma cerută la punctul 1. Dacă '''C=2''', vor fi scrise nouă numere: linia pe care a află numărul '''m''', respectiv poziția acestuia pe această linie, separate printr-un spațiu.
Fișierul de ieșire '''numere18out.txt''' va conține o singură linie. Dacă '''C=1''', va fi scrisă suma cerută la punctul 1. Dacă '''C=2''', vor fi scrise nouă numere: linia pe care a află numărul '''m''', respectiv poziția acestuia pe această linie, separate printr-un spațiu.
== Restricţii şi precizări ==
== Restricţii şi precizări ==
'''1 ⩽ n ⩽ 1000'''
*'''1 ⩽ n ⩽ 1000'''
'''1 ⩽ m ⩽ 1.000.000.000'''
*'''1 ⩽ m ⩽ 1.000.000.000'''
Pentru rezolvarea corectă a cerinţei 1 se acordă 45 de puncte; pentru rezolvarea corectă a cerinței 2 se acordă 55 de puncte.
*Pentru rezolvarea corectă a cerinţei 1 se acordă 45 de puncte; pentru rezolvarea corectă a cerinței 2 se acordă 55 de puncte.
== Exemplul 1 ==
== Exemplul 1 ==
; '''numere18in.txt'''
; '''numere18in.txt'''
Line 32: Line 38:
  1500000000
  1500000000
; '''numere18out.txt'''
; '''numere18out.txt'''
Datele de intrare nu corespund restrictiilor impuse
Datele de intrare nu corespund restrictiilor impuse


== Rezolvare ==
== Rezolvare ==

Latest revision as of 22:46, 4 January 2024

Numerele naturale nenule se scriu pe linii într-un triunghi de forma de mai jos:

1
2 3
4 5 6 
7 8 9 10
...

Cerinţa[edit]

Se dau două numere natural n și m. Determinați:

1. Suma numerelor de pe linia cu numărul n din triunghiul construit ca mai sus.

2. Linia pe care se află numărul m, precum și pe ce poziție se află el pe această linie.

Dându-se Q operații, să se raspundă în ordine la cele de tip 2 și 3.

Date de intrare[edit]

Fișierul de intrare numere18in.txt conține pe prima linie un număr natural C reprezentând cerința din problemă care trebuie rezolvată (1 sau 2).

Dacă C este egal cu 1, a doua linie din fișier conține un număr natural n, reprezentând numărul liniei pe care trebuie să se calculeze suma.

Dacă C este egal cu 2, a doua linie din fișier conține numărul natural m, reprezentând numărul care trebuie căutat în triunghi.

Date de ieșire[edit]

Fișierul de ieșire numere18out.txt va conține o singură linie. Dacă C=1, va fi scrisă suma cerută la punctul 1. Dacă C=2, vor fi scrise nouă numere: linia pe care a află numărul m, respectiv poziția acestuia pe această linie, separate printr-un spațiu.

Restricţii şi precizări[edit]

  • 1 ⩽ n ⩽ 1000
  • 1 ⩽ m ⩽ 1.000.000.000
  • Pentru rezolvarea corectă a cerinţei 1 se acordă 45 de puncte; pentru rezolvarea corectă a cerinței 2 se acordă 55 de puncte.

Exemplul 1[edit]

numere18in.txt
1
4
numere18out.txt
34

Explicatie[edit]

În acest caz se rezolvă doar cerința 1. Numerele de pe linia a 4-a sunt: 7, 8, 9, 10, iar suma lor este 34

Exemplul 2[edit]

numere18in.txt
2
1500000000
numere18out.txt
Datele de intrare nu corespund restrictiilor impuse

Rezolvare[edit]

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

   if n < 1 or n > 1000:
       return "Datele de intrare nu corespund restrictiilor impuse"
   start = n * (n - 1) // 2 + 1
   end = start + n
   return sum(range(start, end))


def linie_numar(m):

   if m < 1 or m > 1000000000:
       return "Datele de intrare nu corespund restrictiilor impuse"
   linie = int(((8 * m + 1) ** 0.5 - 1) / 2)
   start = linie * (linie - 1) // 2 + 1
   pozitie = m - start + 1
   return linie, pozitie


with open('numere18in.txt', 'r') as fin:

   C = int(fin.readline().strip())
   num = int(fin.readline().strip())
   if C == 1:
       result = suma_linie(num)
   else:
       result = linie_numar(num)

with open('numere18out.txt', 'w') as fout:

   if isinstance(result, tuple):
       fout.write(' '.join(map(str, result)))
   else:
       fout.write(str(result))

</syntaxhighlight>