假設我們現在得到一條直線\(y=ax+b\),現在要數出\(x \in [0,n]\)時,在\(x\)正半軸和這條直線之間的整點個數,\(n \le 10^\)
這個方程一定可以化為這樣的形式
\[y=\dfrac
\]列舉\(x \in [0,n]\),直接算其整點個數,答案就是
\[\sum_^n \lfloor \dfrac \rfloor
\]考慮如何快速計算這個式子,我們考慮如何化為子問題
向下取整有這乙個性質(其他性質可以由此推出):
\[\lfloor \dfrac b\rfloor=\lfloor \dfrac \rfloor=\lfloor \dfrac \rfloor + \lfloor\dfrac a b\rfloor
\]然後有兩個重要而顯然的性質:
\[\lfloor \rfloor \le
\]類似的
\[\lceil \rceil \ge
\]還有相互轉換法則
\[\lfloor \rfloor =\lceil \rceil
\]類似的
\[\lceil \rceil = \lfloor\rfloor
\]我覺得不用解釋了吧...
有了上面的芝士,我們考慮
\[\sum_^n \lfloor \dfrac \rfloor
\]時,稍微化歸一下:
現在就只要計算\(a,b< c\)的情況即可,進行一波和式變換
\[\sum_^n \lfloor \rfloor
\]創造條件
\[=\sum_^n \sum_^ \rfloor} 1
\]和式套路
\[= \sum_^n\sum_^ \rfloor} [j \le \lfloor \rfloor]=\sum_^ \rfloor} \sum_^n [j \le \lfloor \rfloor]
\]根據前置芝士
\[=\sum_^ \rfloor} \sum_^n [cj \le ]
\]考慮\(i\)
\[=\sum_^ \rfloor} \sum_^n [cj-b \le ai ]
\]根據前置芝士
\[=\sum_^ \rfloor} \sum_^n [\lceil\rceil \le i ]
\]此時可以直接算出來第二個\(\sigma\)的值
\[=\sum_^ \rfloor} (n-\lceil\rceil+1)
\]根據前置芝士
\[=\sum_^ \rfloor} (n-\lfloor\rfloor+1)
\]提出來
\[=(n+1)\lfloor \rfloor -\sum_^ \rfloor} \lfloor\rfloor
\]後面就是乙個子問題啊!問題規模降了一半以上(當\(c=1\)的時候可以直接等差數列求和\(o(1)\)算)
所以解決原問題的複雜度為
\[t(n)\le o(1)+t()
\]根據主定理
\[t(n)\le \log_2 n
\]那麼問題來了,為啥叫做類歐幾里得演算法呢?因為複雜度證明是相似的...滑稽
萌新瞎講 分塊
推薦!將規模為n的問題,分成 n 塊,每塊規模也是 n 那麼對塊內的操作和整個範圍的操作的複雜度平均,可以在較優的空間複雜度下,將每次操作的複雜度降低到 sqrt 以較低的編碼 複雜度解決問題。initially,我們分好了塊。對於原序列元素a pos 在哪個塊 po s 1n 1 so,我們可以維...
類歐幾里得小記
每次看了很快就忘了,乾脆寫一篇部落格,來加深記憶。設 f a,b,c,n sum lfloor dfrac rfloor g a,b,c,n sum i lfloor dfrac rfloor g a,b,c,n sum rfloor 2 m lfloor dfrac rfloor 當a c時,f ...
類歐幾里得演算法
比較快速地算出下面的式子 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...