文遠知行杯廣東工業大學第十六屆程式設計競賽 A-區間最大值
阿新 • • 發佈:2022-05-07
引理:數論分塊
關於此處的數學規律,有這樣的定理技巧
給定正整數i和n滿足i<=n,使得n/i=n/x成立的最大的x為n/(n/i).
也就是說,因為
1.n/i 的值在某一段中是相等的。
2.在 k:i-x 的區間裡,n/k 是相等的,那麼最大的x也就是區間 [L,R] 的R了,而 L 則是最小的 i。
綜上,得到區間
R=n/(n/L);//R的確定
L=R+1//L的更新
通過變形,可以得到%的運算
題目中的定理使用如下
這裡的 nk-sum 中的 sum 視作[L,R]區間的所有(k/i)* i 相加,因為(k/i)都一樣,所以可以變成
sum=(k/i)*(R-L+1)*(L+R)/2 ;//區間的等差數列求和 Sn=n*(a1+an)/2;
由此可以求得區間的%和了。
很妙,求最大,也就是求i最小的時候得到最大,也就是最左端的端點,對於每個分塊求的最左端的端點,因為是單點求值,所以不需要使用 [n/i] 的變形來節省時間。
對於每個區間,進行分塊操作,每次操作的時間複雜度也很奇妙。
五月了,任重道遠。