1628 - Patrate 1
Enunt[edit | edit source]
Pe o foaie cu pătrăţele se stabileşte un sistem de coordonate în care o intersecţie primeşte coordonatele (0,0), astfel încât fiecare intersecţie a caroiajului are coordonate numere întregi. Pe acest caroiaj se desenează un pavaj cu dreptunghiuri, în care fiecare dreptunghi are o lăţime L şi o înălţime H date, iar punctul de coordonate (0,0) este un colţ de dreptunghiuri. În acest mod, fiecare intersecţie a pavajului are coordonate de forma (L*i,H*j), cu i şi j întregi.
Se mai dă o pereche de întregi x şi y şi se consideră segmentul de dreaptă ce uneşte punctul de coordonate (0,0) cu punctul de coordonate (x,y).
Cerinta[edit | edit source]
Se cere să se determine câte dreptunghiuri ale pavajului sunt intersectate de segmentul considerat. Un dreptunghi se consideră intersectat de segment dacă are cel puţin un punct interior comun. Cu alte cuvinte, dacă segmentul doar atinge colţul unui dreptunghi, nu se consideră că îl intersectează.
Date de intrare[edit | edit source]
Fişierul patrate1in.txt conţine, pe o singură linie, 4 numere separate prin spaţii: L H X Y.
Date de iesire[edit | edit source]
În fişierul patrate1out.txt se va scrie un singur număr întreg reprezentând numărul de dreptunghiuri intersectate de segment.
Restrictii si precizari[edit | edit source]
- 1 ⩽ L, H, X, Y ⩽ 2000000000
Exemplul 1[edit | edit source]
- patrate1in.txt
- 4 2 6 3
- patrate1out.txt
- Datele introduse corespund restrictiilor impuse
- 2
Exemplul 2[edit | edit source]
- patrate1in.txt
- -6 3 0.5 -2
- Datele introduse nu corespund restrictiilor impuse
Rezolvare[edit | edit source]
<syntaxhighlight lang="python3" line="1"> def verifica_restrictii(L, H, X, Y):
if not (1 <= L <= 2000000000 and 1 <= H <= 2000000000): return False if not (abs(X) <= 2000000000 and abs(Y) <= 2000000000): return False return True
def gcd(a, b):
while b: a, b = b, a % b return a
def intersecteaza_dreptunghiuri(L, H, X, Y):
d = gcd(abs(X), abs(Y)) step_x = X // d step_y = Y // d
count = 0
for i in range(1, d + 1): x = i * step_x y = i * step_y
if (x % L == 0 and y % H == 0) or (x % L == 0 and y % H == H) or (x % L == L and y % H == 0): continue
if (x % L != 0 and x % L <= L) and (y % H != 0 and y % H <= H): count += 1
return count
- Citire din fișierul de intrare
with open('patrate1in.txt', 'r') as file:
L, H, X, Y = map(int, file.readline().split())
- Verificare restricții
if verifica_restrictii(L, H, X, Y):
# Calculare numărul de dreptunghiuri intersectate rezultat = intersecteaza_dreptunghiuri(L, H, X, Y)
# Scriere în fișierul de ieșire with open('patrate1out.txt', 'w') as file_out: file_out.write(str(rezultat))
else:
print("Date de intrare nevalide.")
</syntaxhighlight>