php鎖的機制、原理
阿新 • • 發佈:2021-10-05
整除分塊
整除分塊是用來求這樣的式子的:
\(\sum_{i=1}^{n}\lfloor\dfrac k i\rfloor\)
如果打出表會發現這個值是呈階梯狀下降的,然後他的取值最多有 \(2\sqrt n\) 種,所以只要能 \(O(1)\) 求出每個塊的右邊界,就可以將這個 \(O(n)\) 的式子優化到 \(O(\sqrt n)\)。
\(O(1)\) 求右邊界的方法:
設左端點為 \(l\),\(t=\lfloor\dfrac k l\rfloor\),
- \(t\ne0,r=\min(\lfloor\dfrac k t\rfloor,n)\)
- \(t=0,r=n\)
證明:
先證明 \(r=\lfloor\dfrac k t\rfloor\)
\(t=\lfloor\dfrac k l\rfloor\leq\dfrac k l\)
\(\lfloor\dfrac k {\lfloor\frac k t\rfloor}\rfloor\geq\lfloor\dfrac k { \frac k t}\rfloor=t\)
\(\lfloor\dfrac k {\lfloor\frac k l\rfloor}\rfloor\geq t\)
再證明 \(r=\lfloor\dfrac k t\rfloor+1\)
\(\lfloor\dfrac k {\lfloor\frac k t\rfloor+1}\rfloor\leq\dfrac k {\lfloor\frac k t\rfloor+1}\)
只需證 \(\dfrac k {\lfloor\frac k t\rfloor+1}<t\)
把分母乘過去,\(k<t*{\lfloor\frac k t\rfloor+t}\)
設 \(k=x*t+r,0\leq r<t\)
則 \(x*t+r<t*x+t\)
有\(r<t\)
得證。
好像可以拓展到二維,但我還沒看,先咕了