這個演算法用於求一條直線下整點個數,我們定義
\[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...