Processing math: 100%

poniedziałek, 26 maja 2014

17205. Punkty w kole [AL_12_02]

Zadania:
http://pl.spoj.com/problems/AL_12_02
http://spoj.com/ALGOLIGA/problems/AL_12_02

Skrócony opis problemu:
Dla koła o danym r \in \mathbb{N} oraz środku o współrzędnych całkowitych zliczyć ilość punktów o współrzędnych całkowitych leżących w lub na brzegu tego koła.
Jest to tzw. problem koła Gaussa (ang. Gauss circle problem).


Rozwiązanie naiwne:
Można skorzystać ze wzoru:
1+4 \sum_{i=1}^{r^2} (-1)^{i-1}\left\lfloor \frac{r^2}{2i-1} \right\rfloor
lub:
1+4 \sum_{i=0}^{\infty} \left( \left \lfloor \frac{r^2}{4i+1}\right \rfloor -\left \lfloor \frac{r^2}{4i+3} \right \rfloor \right)
Złożoność: O(r^2). Dla pierwszego wzoru jest to jasne, a dla drugiego osiągniemy taki efekt dla warunku końcowego r^2 > 4i+1. Floor dla takich danych jest bowiem równy 0, więc wynik się nie zmieni.

Rozwiązanie sprytne:
Można skorzystać z tego wzoru:
1 + 4\left\lfloor r \right\rfloor + 4\sum_{i=1}^{\left\lfloor r \right\rfloor} \left\lfloor\sqrt{r^2-i^2}\right\rfloor
Złożoność: O(r).

Wyprowadzenie wzoru:
Autorem dowodu jest Adam Bąk.
Wzór ów działa również dla r rzeczywistego, więc uogólnimy, że r \in \mathbb{R}. Bez straty ogólności załóżmy też, że środek koła jest w punkcie \left(0;0\right). Chcemy zatem znaleźć moc (liczność) zbioru \left\lbrace \left(x;y\right) \in \mathbb{Z}^2 : x^2+y^2 \le r^2\right\rbrace (gdyż x^2+y^2 \le r^2 to definicja koła).

Zliczmy najpierw wszystkie punkty na osiach układu współrzędnych. Rozpatrzmy sobie najpierw oś OX dla x \in \mathbb{N}_{+}. Liczb tych będzie \left\lfloor r \right\rfloor. Np. dla r=4.5 będą to punkty: \left(1;0\right), \left(2;0\right), \left(3;0\right), \left(4;0\right) (punkt \left(5;0\right) jest już poza obszarem koła). Będzie tak również dla osi OX dla ujemnych x oraz dla 2 odpowiadających części osi OY. Będzie zatem 4\left\lfloor r \right\rfloor + 1 punktów na osiach. Czemu +1? Bo dodajemy także środek koła, który jest wspólny dla wszystkich fragmentów osi, a możemy policzyć do tylko raz.

Pozostałe punkty również możemy sobie podzielić na 4 ćwiartki, a potem przemnożyć otrzymany wynik przez 4 (jako że są one symetryczne i zawierają tyle samo punktów, o które nam chodzi). Musimy więc obliczyć \left| \left\lbrace \left(x;y\right) \in \mathbb{N}_{+}^2 : x^2+y^2 \le r^2\right\rbrace \right|. Podzielmy sobie problem na znalezienie wszystkich punktów, ale dla konkretnego x \in \mathbb{N}_{+}, a następnie zsumujmy wyniki dla wszystkich możliwych x (a będzie ich \left\lfloor r \right\rfloor). A zatem, dla danego x ilość punktów o współrzędnych całkowitych, leżących wewnątrz koła jest równa największemu y, które mieści się w kole dla tego x. Owo y wynosi \left\lfloor \sqrt{r^2-x^2} \right\rfloor, a bierze się to z przekształcenia definicji koła na \ y^2 \le r^2-x^2. Otrzymujemy więc 4 \sum\limits_{i=1}^{\left\lfloor r \right\rfloor} \left\lfloor\sqrt{r^2-i^2}\right\rfloor dla pozostałych punktów.

A więc weźmy sobie np. r=3. Punktów na osiach będzie 1 + 4 \cdot 3 = 13. Teraz bierzemy sobie x=1. Ile będzie y dla tego x? Ano \left\lfloor\sqrt{3^2-1^2}\right\rfloor = 2. Dla x=2 dostaniemy \left\lfloor\sqrt{3^2-2^2}\right\rfloor = 2, a dla x=3 otrzymamy \sqrt{3^2-3^2} = 0. Ostateczny wynik to zatem 13+4 \cdot \left(2+2+0\right) = 29.

2 komentarze:

  1. drugi wzór nie jest tożsamy z pierwszym, gdyż floor(a) - floor(b) nie jest równy floor(a - b)
    gdyby tak było to złożoność byłaby równa O(r) a obliczenia byłyby szybsze bo liczenie pierwiastka zastąpione byłoby przez dzielenie

    OdpowiedzUsuń
  2. Faktycznie, mój błąd. Dzięki za spostrzegawczość. \ddot\smile

    OdpowiedzUsuń