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