類歐幾里得演算法

2022-05-07 18:45:07 字數 1553 閱讀 1507

這個演算法用於求一條直線下整點個數,我們定義

\[f(a, b, c, n) = \sum_^ \lfloor \frac \rfloor

\]

其他幾個乘係數的擴充套件不想學了tat

\(a \ge c\) 或 \(b \ge c\)

當 \(a \ge c\) 或 \(b \ge c\) 時,我們考慮把分子對 \(c\) 的商和餘數分別提出來,那麼有

\[\begin

f(a, b, c, n)

&= \sum_^ ((\lfloor \frac \rfloor) i + \lfloor \frac ac \rfloor i + \lfloor \frac bc\rfloor)\\

&= f(a \bmod c, b \bmod c, c, n) + \frac \lfloor \frac ac \rfloor + (n + 1) \lfloor \frac bc \rfloor

\end

\]\(a < c\) 且 \(b < c\)

當 \(a < c\) 且 \(b < c\) 時,用幾何意義轉化為一條直線與 \(x\) 軸 \(y\) 軸以及 \(x = n\) 圍成直角梯形內的整點個數。

設上界 \(\displaystyle m = \lfloor \frac \rfloor\) ,那麼我們考慮拆式子

\[\begin

f(a, b, c, n)

&= \sum_^n \sum_^m [\lfloor \frac \rfloor \ge j] \\

&= \sum_^n \sum_^ [\lfloor \frac \rfloor \ge j + 1] \\

&= \sum_^n \sum_^ [(\frac) \ge j + 1]\\

&= \sum_^n \sum_^ [ai \ge jc + c - b]\\

&= \sum_^n \sum_^ [i \ge \frac]\\

\end

\]

很多地方都可以捨掉取整,因為整數和分數比較大小(考慮等於)的時候可以忽略下取整。

考慮分子減 \(1\) 換成 \(>\) 並交換和式:

\[\begin

f(a, b, c, n)

&= \sum_^n \sum_^ [i > \frac]\\

&= \sum_^ \sum_^n [i > \frac]\\

&= \sum_^ (n - \frac)\\

&= nm - \sum_^ \frac\\

&= nm - f(c, c - b - 1, a, m - 1)

\end

\]然後我們就可以遞迴處理了。

我們只觀察 \(ac\) 兩位,如果 \(a > c\) 那麼 \(a \bmod c\) ,否則交換 \(ac\) 。

那麼複雜度其實和擴充套件歐幾里得演算法是一樣的 \(\mathcal o(\log n)\) 。

求 \(f\) 還是比較短的。

ll f(ll a, ll b, ll c, ll n)

類歐幾里得演算法

比較快速地算出下面的式子 f n,a,b,c,k 1,k 2 sum limits n x lfloor frac rfloor 不妨假設現在 a geq c 或 b geq c 那麼 sum limits n x lfloor frac rfloor sum limits n x lfloor f...

類歐幾里得演算法

對於給定的元 a,b,c,n 設 f i lfloor frac rfloor 求 f a,b,c,n sum 0 nf i g a,b,c,n sum 0 nf i 2 h a,b,c,n sum 0 ni cdot f i lfloor frac rfloor lfloor frac rfloo...

類歐幾里得演算法

萬惡之源 首先推一下可以發現,我們可以分 位 計算。設二進位制下第 k 對答案的貢獻為 mathrm 則 mathrm sum limits texttt sum limits left lfloor frac right rfloor bmod 2 sum limits left lfloor f...