2960 - Abx
Un număr natural n
se numește putere dacă există două numere naturale a
, b
, a ≥ 1
, b ≥ 2
astfel încât . De exemplu, numerele 32
, 169
, 1
sunt puteri ( , , ), iar 72
, 2000
și 31
nu sunt puteri.
Se citesc numerele naturale N
, M
și un șir de N
numere naturale din intervalul [1,M]
.
Cerința[edit | edit source]
Pentru fiecare din cele N
numere determinați câte un număr natural din intervalul [1,M]
, cu proprietatea că este o putere și pentru orice altă putere p
din intervalul [1,M]
este îndeplinită condiția , unde |x|
reprezintă valoarea absolută a lui x
(modulul).
Dacă există două puteri egal depărtate de se va alege puterea cea mai mică. De exemplu pentru numărul 26
, dintre puterile 25
și 27
va fi ales numărul 25
.
Date de intrare[edit | edit source]
Fișierul de intrare input.txt
conține pe prima linie două numere N
și M
, iar pe fiecare dintre următoarele N
linii se găsește câte un număr natural (1 ≤ i ≤ N
), cu semnificația de mai sus. Numerele aflate pe aceeași linie a fișierului sunt separate prin câte un spațiu.
Date de ieșire[edit | edit source]
Fișierul de ieșire output.txt
va conține N
linii, pe fiecare linie i
(1 ≤ i ≤ N
) aflându-se numărul natural cu semnificația din enunț.
Restricții și precizări[edit | edit source]
- 1<=n<=5000
- 10<=m<=10^18
Exemplul 1[edit | edit source]
input.txt:
8 1000
345
99
999
500
123
124
99
256
output.txt:
343
100
1000
512
121
125
100
256
Explicație:
343 = 7^3
100 = 10^2
1000 = 10^3
512 = 2^9
121 = 11^2
125 = 5^3
100 = 10^2
256 = 2^8
Exemplul 2[edit | edit source]
input.txt:
999999999999 1000
345
99
999
500
123
124
99
256
Output:
Error: n is not within the valid range (1 <= n <= 5000)
Rezolvare[edit | edit source]
<syntaxhighlight lang="python3" line="1"> import math import sys
def verify_constraints(n, m):
if not (1 <= n <= 5000): sys.exit("Error: n is not within the valid range (1 <= n <= 5000)")
if not (10 <= m <= 10**18): sys.exit("Error: m is not within the valid range (1 <= m <= 10^18)")
def lgput(x, y):
ans = 1 aux = x p = 1 while p <= y: if y & p: ans *= aux aux *= aux p <<= 1 return ans
def cautb(x, put):
st = 1 dr = int(x ** (1 / put)) while st <= dr: mij = (st + dr) // 2 if lgput(mij, put) > x: dr = mij - 1 else: st = mij + 1 return dr
with open("input.txt", "r") as f, open("output.txt", "w") as g:
n, m = map(int, f.readline().split()) verify_constraints(n, m) a_values = [int(f.readline()) for _ in range(n)]
for a in a_values: sol = 0 dif = m + 100 for j in range(2, 61): y = cautb(a, j) z = lgput(y, j) if abs(a - z) <= dif and z <= m: sol = z dif = abs(a - z) z = lgput(y + 1, j) if abs(a - z) < dif and z <= m: sol = z dif = abs(a - z) g.write(str(sol) + "\n")
</syntaxhighlight>