1237 - Numereiajb: Difference between revisions
No edit summary |
|||
Line 1: | Line 1: | ||
== Cerinta == | == Cerinta == | ||
Numerele iajb sunt numerele care pot fi scrise sub forma i * a + j * b, cu i și j numere naturale și i + j > 0. | Numerele <code>iajb</code> sunt numerele care pot fi scrise sub forma <code>i * a + j * b</code>, cu <code>i</code> și <code>j</code> numere naturale și <code>i + j > 0</code>. | ||
Cunoscând a și b și un număr n, să se determine valorile i și j pentru care se vor forma primele n numere iajb in ordine crescătoare. | Cunoscând <code>a</code> și <code>b</code> și un număr <code>n</code>, să se determine valorile <code>i</code> și <code>j</code> pentru care se vor forma primele <code>n</code> numere <code>iajb</code> in ordine crescătoare. | ||
= Date de intrare = | |||
Fișierul de intrare <code>numereiajbIN.txt</code> conține pe prima linie numărul <code>3</code> numere naturale <code>a</code>, <code>b</code> și <code>n</code>, având semnificațiile de mai sus. | |||
Fișierul de | = Date de ieșire = | ||
Fișierul de ieșire <code>numereiajbOUT.txt</code> va conține pe cele <code>n</code> linii câte o pereche de numere naturale <code>i</code> și <code>j</code> care răspund cerinței. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse". | |||
= | = Restricții și precizări = | ||
* <code>1 ≤ n ≤ 2.000.000</code> (!) | |||
* <code>1 ≤ a, b ≤ 50.000</code> | |||
* Dacă un număr <code>iajb</code> se obține din perechi diferite de <code>(i, j)</code> atunci se va afișa doar cea cu <code>i</code>-ul minim | |||
== | = Exemplul 1: = | ||
<code>numereiajbIN.txt</code> | |||
2 3 5 | |||
<code>numereiajbOUT.txt</code> | |||
1 0 | |||
0 1 | |||
2 0 | |||
1 1 | |||
0 2 | |||
* | == Explicație == | ||
* | <code>1 * 2 + 0 * 3 = 2</code> | ||
<code>0 * 2 + 1 * 3 = 3</code> | |||
<code>2 * 2 + 0 * 3 = 4</code> | |||
<code>1 * 2 + 1 * 3 = 5</code> | |||
<code>0 * 2 + 2 * 3 = 6</code> | |||
:Datele | == Exemplul 2: == | ||
<code>numereiajbIN.txt</code> | |||
2 3 50001 | |||
<code>numereiajbOUT.txt</code> | |||
Datele nu corespund restrictiilor impuse | |||
== Rezolvare == | |||
<syntaxhighlight lang="python3" line="1"> | |||
def verificare_restrictii(n, a, b): | |||
: | if not (1 <= n <= 2000000 and 1 <= a <= 50000 and 1 <= b <= 50000): | ||
with open("numereiajbOUT.txt", "w") as fout: | |||
fout.write("Datele nu corespund restrictiilor impuse") | |||
return False | |||
return True | |||
== | |||
: | |||
== | def main(): | ||
fin = open("numereiajbIN.txt", "r") | |||
fout = open("numereiajbOUT.txt", "w") | |||
n, a, b = map(int, fin.readline().split()) | |||
if not verificare_restrictii(n, a, b): | |||
fin.close() | |||
fout.close() | |||
return | |||
Q = [[], []] | |||
Q[0].append((1, 0)) | |||
Q[1].append((0, 1)) | |||
last = -1 | |||
for t in range(1, n + 1): | |||
crt = [Q[j][0][0] * a + Q[j][0][1] * b for j in range(2)] | |||
if crt[0] < crt[1]: | |||
i, j = Q[0].pop(0) | |||
nr = crt[0] | |||
else: | |||
i, j = Q[1].pop(0) | |||
nr = crt[1] | |||
if nr == last: | |||
t -= 1 | |||
continue | |||
last = nr | |||
fout.write(f"{i} {j}\n") | |||
Q[0].append((i + 1, j)) | |||
Q[1].append((i, j + 1)) | |||
fin.close() | |||
fout.close() | |||
if __name__ == "__main__": | |||
main() | |||
</syntaxhighlight> | </syntaxhighlight> |
Latest revision as of 07:20, 23 February 2024
Cerinta[edit | edit source]
Numerele iajb
sunt numerele care pot fi scrise sub forma i * a + j * b
, cu i
și j
numere naturale și i + j > 0
.
Cunoscând a
și b
și un număr n
, să se determine valorile i
și j
pentru care se vor forma primele n
numere iajb
in ordine crescătoare.
Date de intrare[edit | edit source]
Fișierul de intrare numereiajbIN.txt
conține pe prima linie numărul 3
numere naturale a
, b
și n
, având semnificațiile de mai sus.
Date de ieșire[edit | edit source]
Fișierul de ieșire numereiajbOUT.txt
va conține pe cele n
linii câte o pereche de numere naturale i
și j
care răspund cerinței. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse".
Restricții și precizări[edit | edit source]
1 ≤ n ≤ 2.000.000
(!)1 ≤ a, b ≤ 50.000
- Dacă un număr
iajb
se obține din perechi diferite de(i, j)
atunci se va afișa doar cea cui
-ul minim
Exemplul 1:[edit | edit source]
numereiajbIN.txt
2 3 5
numereiajbOUT.txt
1 0 0 1 2 0 1 1 0 2
Explicație[edit | edit source]
1 * 2 + 0 * 3 = 2
0 * 2 + 1 * 3 = 3
2 * 2 + 0 * 3 = 4
1 * 2 + 1 * 3 = 5
0 * 2 + 2 * 3 = 6
Exemplul 2:[edit | edit source]
numereiajbIN.txt
2 3 50001
numereiajbOUT.txt
Datele nu corespund restrictiilor impuse
Rezolvare[edit | edit source]
<syntaxhighlight lang="python3" line="1"> def verificare_restrictii(n, a, b):
if not (1 <= n <= 2000000 and 1 <= a <= 50000 and 1 <= b <= 50000): with open("numereiajbOUT.txt", "w") as fout: fout.write("Datele nu corespund restrictiilor impuse") return False return True
def main():
fin = open("numereiajbIN.txt", "r") fout = open("numereiajbOUT.txt", "w")
n, a, b = map(int, fin.readline().split()) if not verificare_restrictii(n, a, b): fin.close() fout.close() return
Q = [[], []] Q[0].append((1, 0)) Q[1].append((0, 1)) last = -1
for t in range(1, n + 1): crt = [Q[j][0][0] * a + Q[j][0][1] * b for j in range(2)] if crt[0] < crt[1]: i, j = Q[0].pop(0) nr = crt[0] else: i, j = Q[1].pop(0) nr = crt[1] if nr == last: t -= 1 continue last = nr fout.write(f"{i} {j}\n") Q[0].append((i + 1, j)) Q[1].append((i, j + 1))
fin.close() fout.close()
if __name__ == "__main__":
main()
</syntaxhighlight>