Opracowanie SAD: Sad

Transkrypt

Opracowanie SAD: Sad
Opracowanie SAD: Sad
Autor zadania: Joachim Jelisiejew, Jacek Tomasiewicz.
Rozwiązanie
Na początku wprowadźmy pojęcie punktu kratowego. Jest to taki punkt, którego obie współrzędne są całkowite.
Oznaczmy również długości boków prostokąta ܽ = ‫ݔ‬2 − ‫ݔ‬1, ܾ = ‫ݕ‬2 − ‫ݕ‬1.
Zauważmy, że wynikiem jest liczba punktów kratowych w prostokącie, nie leżących na przekątnej, podzielona
przez 2. Liczba wszystkich punktów kratowych w prostokącie (razem z tymi na przekątnej) to (ܽ − 1) ∗ (ܾ − 1).
Zatem, jeżeli będziemy znali liczbę punktów kratowych na przekątnej prostokąta, to wynik będziemy potrafili policzyć
jako
(௔ିଵ)∗(௕ିଵ)ି ௣௥௭௘௞ą௧௡௔
ଶ
. Natomiast liczba punktów kratowych na przekątnej wynosi ݊‫ܽ(݀ݓ‬, ܾ) − 1, gdzie
݊‫ ݀ݓ‬to największy wspólny dzielnik dwóch liczb.
Szkic dowodu
Przesuńmy lewy dolny róg prostokąta do punktu (0, 0). Teraz dla każdego punktu (x1, y1) leżącego na przekątnej
zachodzi
௬ଵ
௫ଵ
௕
= ௔.
Najmniejszy punkt kratowy leżący na przekątnej ma współrzędne
௔
௕
ቀ௡௪ௗ(௔,௕) , ௡௪ௗ(௔,௕)ቁ.
Współrzędne tego punktu możemy pomnożyć przez dowolną liczbę całkowitą z przedziału ‫ۃ‬1, ݊‫ܽ(݀ݓ‬, ܾ)‫ ۄ‬, aby
otrzymać różne punkty, przy czym nie liczymy punktu o współrzędnych (a, b), ponieważ leży na obwodzie. Jest więc
݊‫ܽ(݀ݓ‬, ܾ) − 1 różnych punktów leżących na przekątnej, ale nie na obwodzie.
Należy zwrócić uwagę na konieczność użycia typu 64-bitowego do obliczenia wyniku. Złożoność algorytmu jest
taka, jak złożoność obliczenia największego wspólnego dzielnika dwóch liczb.
Pseudokod
1.
2.
3.
4.
5.
6.
7.
wczytaj(x1, y1, x2, y2)
a := x2 - x1
b := y2 - y1
prostokat := (a - 1) * (b - 1)
przekatna := nwd(a, b) - 1
wynik := (prostokat – przekatna)/2
wypisz(wynik)
Opracowanie SAD: Sad
1/1