整除分塊 學習筆記

2022-10-10 07:51:08 字數 1907 閱讀 2342

板子題-uva11526

題目大意:

給定乙個 \(n\),求 \(\sum\limits_^\lfloor \frac \rfloor\)。其中 \(n\) 為 \(32\) 位無符號整數。

顯然如果暴力求解肯定是不可行的,顯然會 tle,所以我們需要找一種複雜度更優的演算法。

我們可以先令 \(n=10\),觀察一下函式 \(\operatorname(x)=\lfloor\frac\rfloor\) 的影象:

觀察可以發現,不難發現:

當 \(x=1\) 的時候,\(\operatorname(x)=10\)。

當 \(x=2\) 的時候,\(\operatorname(x)=5\)。

當 \(x=3\) 的時候,\(\operatorname(x)=3\)。

當 \(x=4,5\) 的時候,\(\operatorname(x)=2\)。

當 \(x=6,7,8,9,10\) 的時候,\(\operatorname(x)=1\)。

我們是否能夠預處理出每個使 \(\operatorname(x)\) 相同的區間來更快地計算答案呢?

不難發現以下結論:

\[\forall n\in\mathbb_+, \left| \\rfloor \mid i\in\mathbb_+,i\le n \} \right| \le 2 \lfloor\sqrt\rfloor

\]證明:

當 \(i\le \lfloor\sqrt\rfloor\) 時,\(\lfloor\frac\rfloor\) 最多 \(\lfloor\sqrt\rfloor\) 個數字。

當 \(\lfloor\sqrt\rfloor時,\(1\le\lfloor\frac\rfloor\le\lfloor\sqrt\rfloor\),最多有 \(\lfloor\sqrt\rfloor\) 個數字。

因此最多只有 \(2\sqrt\) 個數字。

對於乙個數字 \(n\),如果 \(\lfloor\frac\rfloor=\lfloor\frac\rfloor\) 成立,那麼滿足 \(i最大的 \(j\) 為 \(\lfloor\frac\rfloor}\rfloor\)

根據前面的結論,這種做法的複雜度為 \(\theta\left(\sqrt\right)\)。

**:

#include#define ll long long

using namespace std;

ll n,ans;

void work()

printf("%lld",ans),putchar('\n'); return;

}int main()

顯然在一般的求值題目中的式子不會這麼簡單,一般都形如

\[\sum_^\operatorname(i)\lfloor\frac\rfloor

\]此時預處理出 \(\operatorname(x)\) 的字首和 \(\operatorname(x)\) 就可以在 \(\theta\left(\sqrt\right)\) 求出這個式子的值了。

**大致如下:

l=1,sum=0;

while(l<=n)

如果求值的函式中含有 \(\lfloor\frac\rfloor+\lfloor\frac\rfloor+\dots+\lfloor\frac\rfloor\),

那麼我們只需要將前面的結論的 \(\lfloor\frac\rfloor}\rfloor\) 改為 \(\min \limits^_ \lfloor\frac\rfloor}\rfloor\) 即可。

(當然 \(n=2,n=3\) 的情況比較常見)

整除分塊學習筆記

其實一直沒有把整除分塊看成乙個演算法,只看成乙個思維。然後發現我不會思維了,於是來補一下學習筆記。看一道例題 uva11526 就是求 sum limits 我們發現很多值都是一樣的,所以可以快速計算掉。具體的,我們發現 i 到 frac 內所有數是一樣的。那麼就可以 o sqrt n 計算了。但是...

整除分塊 學習筆記

hgoi20181027模擬題 給定n,m,快速求出 fht n,m 1e9 7 的值。對於100 的資料 n,m 1,000,000,000 然後為了這個問題我們去找了整除分塊的演算法 對於g n,k 化簡 顯然 a b a a b b 在c 中floor a b a b 所以我們打個表來看看k ...

整除分塊學習筆記

假如我們要對這樣的式子進行求和 sum limits f i 如果 f i 的取值有限,只有 m 個,且對於所有的 f i x 在序列中都是連續的一段,那麼就可以進行值域分段求和。找出每個取值 x 在原序列中的第一次出現的位置 l x 和最後一次出現的位置 r x 可以在 o m 的時間內算出答案 ...