1112 - Puteri4
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>
- 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>