1112 - Puteri4: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == Enunt == Nu e un secret pentru nimeni faptul că Mireluş se antrenează în timpul liber cu probleme de algoritmică. De curând a aflat că un număr natural N, pentru care există două numere naturale nenule A şi B (B>1) astfel încât N = A^B, se numeşte putere. Mireluş şi-a propus să determine numărul de puteri din intervalul [X, Y], unde X şi Y sunt numere naturale nenule. Cum probabil v-aţi imaginat deja, Mireluş nu a reuşit să rezolve această problem...
 
No edit summary
 
Line 1: Line 1:
== Enunt ==
== Enunt ==
Nu e un secret pentru nimeni faptul că Mireluş se antrenează în timpul liber cu probleme de algoritmică. De curând a aflat că un număr natural N, pentru care există două numere naturale nenule A şi B (B>1) astfel încât N = A^B, se numeşte putere. Mireluş şi-a propus să determine numărul de puteri din intervalul [X, Y], unde X şi Y sunt numere naturale nenule.
Nu e un secret pentru nimeni faptul că Mireluş se antrenează în timpul liber cu probleme de algoritmică. De curând a aflat că un număr natural '''N''', pentru care există două numere naturale nenule '''A''' şi '''B''' (B>1) astfel încât '''N = A^B''', se numeşte '''putere'''. Mireluş şi-a propus să determine numărul de puteri din intervalul '''[X, Y]''', unde '''X şi Y''' sunt numere naturale nenule.


Cum probabil v-aţi imaginat deja, Mireluş nu a reuşit să rezolve această problemă şi a decis să ceară ajutorul Olimpiei D’Info. Pentru a fi sigur că nici ea nu greşeşte, i-a dat un set de intervale şi i-a cerut să determine pentru fiecare interval numărul de puteri corespunzător.
Cum probabil v-aţi imaginat deja, Mireluş nu a reuşit să rezolve această problemă şi a decis să ceară ajutorul Olimpiei D’Info. Pentru a fi sigur că nici ea nu greşeşte, i-a dat un set de intervale şi i-a cerut să determine pentru fiecare interval numărul de puteri corespunzător.


== Cerință ==
== Cerință ==
Dându-se numărul de intervale T şi pentru fiecare din cele T intervale cele două extremităţi, determinaţi numărul de puteri corespunzător fiecărui interval dat de Mireluş Olimpiei.
Dându-se numărul de intervale '''T''' şi pentru fiecare din cele T intervale cele două extremităţi, determinaţi numărul de '''puteri''' corespunzător fiecărui interval dat de Mireluş Olimpiei.


== Date de intrare ==
== Date de intrare ==
Fișierul de intrare puteri4in.txt conține pe prima linie numărul de intervale T, iar pe fiecare din următoarele T linii câte 2 numere naturale nenule X şi Y, separate prin exact un spaţiu, reprezentând extremităţile intervalelor.
Fișierul de intrare '''puteri4in.txt''' conține pe prima linie numărul de intervale '''T''', iar pe fiecare din următoarele '''T''' linii câte 2 numere naturale nenule '''X şi Y''', separate prin exact un spaţiu, reprezentând extremităţile intervalelor.


== Date de ieșire ==
== Date de ieșire ==
Fișierul de ieșire puteri4out.txt va conține T linii. Fiecare linie va conţine numărul de puteri care aparţin intervalului corespunzător din fişierul de intrare.
Fișierul de ieșire '''puteri4out.txt''' va conține '''T''' linii. Fiecare linie va conţine numărul de puteri care aparţin intervalului corespunzător din fişierul de intrare.


== Restricții și precizări ==
== Restricții și precizări ==
*1 ⩽ T ⩽ 131.
*'''1 ⩽ T ⩽ 131'''.
*1 ⩽ X ⩽ Y ⩽ 10^18.
*'''1 ⩽ X ⩽ Y ⩽ 10^18.'''
*Intervalul [X, Y] conţine şi numerele X şi Y.
*Intervalul '''[X, Y]''' conţine şi numerele X şi Y.
*Pentru 10% din teste Y ⩽ 5000.
*Pentru 10% din teste '''Y ⩽ 5000.'''
*Pentru alte 25% din teste Y ⩽ 100 000.
*Pentru alte 25% din teste '''Y ⩽ 100 000'''.
*Pentru alte 20% din teste Y ⩽ 10 000 000.
*Pentru alte 20% din teste '''Y ⩽ 10 000 000'''.
== Exemplu 1 ==
== Exemplu 1 ==
;puteri4in.txt
;'''puteri4in.txt'''
:1
:1
:1 36
:1 36
;puteri4out.txt
;'''puteri4out.txt'''
:9
:9
:Datele corespund
:Datele corespund
<br>
<br>
== Exemplu 2 ==
== Exemplu 2 ==
;puteri4in.txt
;'''puteri4in.txt'''
:0
:0
:0 0
:0 0
;puteri4out.txt
;'''puteri4out.txt'''
:Datele nu corespund
:Datele nu corespund
<br>
<br>

Latest revision as of 15:04, 6 January 2024

Enunt[edit | edit source]

Nu e un secret pentru nimeni faptul că Mireluş se antrenează în timpul liber cu probleme de algoritmică. De curând a aflat că un număr natural N, pentru care există două numere naturale nenule A şi B (B>1) astfel încât N = A^B, se numeşte putere. Mireluş şi-a propus să determine numărul de puteri din intervalul [X, Y], unde X şi Y sunt numere naturale nenule.

Cum probabil v-aţi imaginat deja, Mireluş nu a reuşit să rezolve această problemă şi a decis să ceară ajutorul Olimpiei D’Info. Pentru a fi sigur că nici ea nu greşeşte, i-a dat un set de intervale şi i-a cerut să determine pentru fiecare interval numărul de puteri corespunzător.

Cerință[edit | edit source]

Dându-se numărul de intervale T şi pentru fiecare din cele T intervale cele două extremităţi, determinaţi numărul de puteri corespunzător fiecărui interval dat de Mireluş Olimpiei.

Date de intrare[edit | edit source]

Fișierul de intrare puteri4in.txt conține pe prima linie numărul de intervale T, iar pe fiecare din următoarele T linii câte 2 numere naturale nenule X şi Y, separate prin exact un spaţiu, reprezentând extremităţile intervalelor.

Date de ieșire[edit | edit source]

Fișierul de ieșire puteri4out.txt va conține T linii. Fiecare linie va conţine numărul de puteri care aparţin intervalului corespunzător din fişierul de intrare.

Restricții și precizări[edit | edit source]

  • 1 ⩽ T ⩽ 131.
  • 1 ⩽ X ⩽ Y ⩽ 10^18.
  • Intervalul [X, Y] conţine şi numerele X şi Y.
  • Pentru 10% din teste Y ⩽ 5000.
  • Pentru alte 25% din teste Y ⩽ 100 000.
  • Pentru alte 20% din teste Y ⩽ 10 000 000.

Exemplu 1[edit | edit source]

puteri4in.txt
1
1 36
puteri4out.txt
9
Datele corespund


Exemplu 2[edit | edit source]

puteri4in.txt
0
0 0
puteri4out.txt
Datele nu corespund


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 1112 - Puteri4

def este_putere(numar):

   # Verifică dacă un număr este putere
   for baza in range(2, int(numar ** 0.5) + 1):
       exponent = 2
       putere = baza ** exponent
       while putere <= numar:
           if putere == numar:
               return True
           exponent += 1
           putere = baza ** exponent
   return False

def numar_puteri_in_interval(X, Y):

   numar_puteri = 1
   for numar in range(X, Y + 1):
       if este_putere(numar):
           numar_puteri += 1
   return numar_puteri

def main():

   try:
       with open("puteri4in.txt", "r") as fin:
           T = int(fin.readline().strip())
           intervale = [list(map(int, fin.readline().strip().split())) for _ in range(T)]
   except FileNotFoundError:
       print("Fișierul puteri4in.txt nu a fost găsit.")
       return
   except ValueError:
       print("Datele din fișierul de intrare nu sunt corecte.")
       return
   try:
       with open("puteri4out.txt", "w") as fout:
           for interval in intervale:
               numar_puteri = numar_puteri_in_interval(interval[0], interval[1])
               fout.write(str(numar_puteri) + "\n")
       print("Datele corespund.")
   except IOError:
       print("Nu s-a putut scrie în fișierul de ieșire.")

if __name__ == "__main__":

   main()


</syntaxhighlight>