1. 程式人生 > >類歐幾里得一般形式

類歐幾里得一般形式

什麼是類歐幾里得

類歐幾里得可以用兩種方式描述:

①求出以下黃色部分中整點個數(整點可以在兩條直線方程上,在x軸上不算)

②給出a,b,c,n,求出f(a, b, c, n),其中

\small f(a,b,c,n)=\sum_{i=0}^{n}\left \lfloor \frac{ai+b}{c} \right \rfloor

類歐幾里得的一般形式

形式①(標準類歐幾里得):

\small f(a,b,c,n)=\sum_{i=0}^{n}\left \lfloor \frac{ai+b}{c} \right \rfloor(其中a, c為整數)

當b≥c時,相當於上面圖片中黃色的三角形下面多出一塊包含整點的小矩形

很容易推出\small f(a,b,c,n)=f(a,b\%c,c,n)+(n+1)\left \lfloor \frac{b}{c} \right \rfloor

當a≥c時,相當於圖片中黃色的三角形斜邊斜率>1,這個時候可以找到最大的正整數k滿足k≤a/c,然後先計算在黃色陰影中y=kx+b這條直線下面整點的個數,再計算在黃色部分中剩下部分的整點個數,可以推出

\small f(a,b,c,n)=f(a\%c,b,c,n)+\frac{n(1+n)}{2}\left \lfloor \frac{a}{c} \right \rfloor,對應變換如下圖2:

當a<c且b<c時,也就是上面圖2中最右邊的那種情況

可以發現,這個三角形可以通過改變兩條直角邊來變成上面兩種情況,為了更好的理解,這裡就不秀公式了,直接上圖

對於圖3,其中\small m=\left \lfloor \tfrac{an+b}{c} \right \rfloor,轉換之後原先的斜率a/c變成相反數c/a,可以得出

\small f(a,b,c,n)=nm-p,其中p為左圖紅點個數(別忘了x軸上整點不算,所以上面會多一排紅點)

而左圖的紅點剛好構成了另外一個斜率>1的直角三角形,將它轉正成右圖,這樣就可以得到遞推式

\small f(a,b,c,n)=nm-f(c,c-b-1,a,m-1)搞定,其中c和a交換因為斜率正好變為相反數,b變為c-b-1是為了保證三角形在沒翻轉之前和原三角形斜邊中間不會有多餘的點,且不和斜邊相重合

公式遞推:

\small f(a,b,c,n)=\sum_{x=0}^{n}\sum_{y=1}^{m}\left [ y\leq \left \lfloor \frac{ax+b}{c} \right \rfloor \right ]=f(a,b,c,n)=\sum_{x=0}^{n}\sum_{y=0}^{m-1}\left [ y+1\leq \left \lfloor \frac{ax+b}{c} \right \rfloor \right ]

\small =\sum_{x=0}^{n}\sum_{y=0}^{m-1}\left [ yc+c-b\leq ax \right ]=\sum_{x=0}^{n}\sum_{y=0}^{m-1}\left [ \frac{yc+c-b-1}{a}< x \right ]

\small =\sum_{y=0}^{m-1}(n-\left \lfloor \frac{yc+c-b-1}{a} \right \rfloor)=nm-f(c,c-b-1,a,m-1)

總體當a=0或n=0或n=1時遞推結束,總複雜度O(log)級別