例題:
求 ∑i=o(n1n⌊n
i⌋
\sum_^n \lfloor \frac n i \rfloor
∑i=1n
⌊in
⌋
)o(n)
o(n)
的做法很顯然,但是一般n會很大,於是有了除法分塊。
對於一段連續的 i
ii,⌊ni
⌋\lfloor \dfrac n i \rfloor
⌊in
⌋ 可能是相同的,比如說當 i
ii 的值在區間 [6,
10]
[6,10]
[6,10]
時,⌊ni⌋
=1
\lfloor \dfrac n i \rfloor=1
⌊in⌋=
1,都是相同的,於是問題轉變成了要找到這些區間。
於是有了這樣的遞迴過程(證明在下面):
int l=
1,r;
while
(l<=n)
看起來是很簡單,證明事實上也很簡單。
l
ll 的初值為 1
11 是毫無疑問的,遞迴時 l=r
+1
l=r+1
l=r+
1 也是毫無疑問的,重點時 r
rr 的值是如何確定的。
證明1(反證法):
顯然 r
rr 滿足 ⌊nr
⌋=⌊n
l⌋
\lfloor \dfrac n r \rfloor=\lfloor \dfrac n l \rfloor
⌊rn⌋=
⌊ln
⌋,需要證明的是 r
rr 是這個區間的邊界。
設 r
rr 不是這個區間的邊界,那麼至少有 r+1
r+1r+
1 滿足 ⌊nr
+1⌋=
⌊nl⌋
\lfloor \dfrac n \rfloor=\lfloor \dfrac n l \rfloor
⌊r+1n
⌋=⌊l
n⌋。
設 ⌊ nr
⌋=⌊n
l⌋=x
\lfloor \dfrac n r \rfloor=\lfloor \dfrac n l \rfloor=x
⌊rn⌋=
⌊ln
⌋=x。
因為 ⌊nr
+1
⌋\lfloor \dfrac n \rfloor
⌊r+1n
⌋ 是向下取整,所以有
⌊ nr
+1⌋×
(r+1
)≤
n\lfloor \dfrac n \rfloor\times (r+1) \leq n
⌊r+1n
⌋×(r
+1)≤nx×
(r+1
)≤
nx \times (r+1) \leq n
x×(r+1
)≤nx×(
r+1)
x≤⌊n
x⌋
\dfrac x\leq \lfloor\dfrac n x \rfloor
xx×(r+
1)≤
⌊xn
⌋ 因為 r=⌊
nx
⌋r=\lfloor \dfrac n x \rfloor
r=⌊xn
⌋,那麼有
x ×(
r+1)
x≤
r\dfrac x\leq r
xx×(r+
1)≤
r r +1
≤r
r+1\leq r
r+1≤r
柿子不成立,則得證。
證明2:
依然設 ⌊nl
⌋=
x\lfloor \dfrac n l \rfloor=x
⌊ln⌋=
x。現在要找到乙個最大的 r
rr,滿足 x×r
≤n
x \times r \leq n
x×r≤n。
移項得 r≤⌊
nx
⌋r \leq \lfloor \dfrac n x \rfloor
r≤⌊xn
⌋ 所以 r
rr 的最大值為 ⌊nx
⌋\lfloor \dfrac n x \rfloor
⌊xn⌋。
時間複雜度為 o(2
n)
o(2\sqrt n)
o(2n)
,這個也很好證明,當 x≤n
x\leq \sqrt n
x≤n
時,xx
x 只有 n
\sqrt n
n種取值,也就是說這樣的塊數不會超過 n
\sqrt n
n塊;當 x≥n
x \geq \sqrt n
x≥n
時,有 ⌊nx
⌋≤
n\lfloor \dfrac n x \rfloor \leq \sqrt n
⌊xn⌋≤
n,也就是說此時 l
ll 和 r
rr 的取值都 ≤
n\leq \sqrt n
≤n,所以這樣的塊數也不會超過 n
\sqrt n
n塊。如果將問題的形式轉變一下,比如說:
∑ i=
1n(⌊
ni⌋)
k\sum_^n (\lfloor \frac n i \rfloor)^k
i=1∑n
(⌊in
⌋)k
又比如說
∑ i=
1n⌊n
i⌋⌊m
i⌋
\sum_^n \lfloor \frac n i \rfloor \lfloor \frac m i \rfloor
i=1∑n
⌊in
⌋⌊im
⌋更比如說
∑ i=
1n(⌊
ni⌋−
⌊mi⌋
)k
\sum_^n (\lfloor \frac n i \rfloor-\lfloor \frac m i \rfloor)^k
i=1∑n
(⌊in
⌋−⌊
im⌋
)k不管如何變,這些其實都是可以用除法分塊來做的,不要被形式迷惑了。
Fear Factoring 除法分塊)
借鑑 無法估計他的值時最好用無符號的long long 除法分塊 區塊值 區塊始末 舉個例子 12 次數是有12 n算出來的 像當n 5時 12 5 2,也就是說5出現了兩次 1 12次 2 6次 3 4次 4 3次 5 2次 6 2次 7 1次 8 1次 9 1次 10 1次 11 1次 12 1...
除法分塊 數論
問題 當我們暴力的時候時間複雜度為o n 但是我們可以把時間複雜度降到o sqrt n 這點時間優化在數論中可是不能小視的。除法分塊 所謂分塊,就是把一段數分成不同的區間,而這些區間的每乙個數除以同乙個數的值是相同的,所以我們就把這些區間統一處理,就不用再來乙個乙個遍歷 例 問題中我們假設n 10。...
Dividing(除法分塊總結)
傳送門 題意 橫縱座標均有個範圍 1,n 1,k 求在這個範圍裡滿足要求點的數量,要求如下 畫圖推點易得,每一列的點數 利用o根號n除法分塊就可以算出答案,最後還要注意第一列多算了n要減掉 define crt secure no warnings include include include i...