1. 程式人生 > 其它 >文遠知行杯廣東工業大學第十六屆程式設計競賽 A-區間最大值

文遠知行杯廣東工業大學第十六屆程式設計競賽 A-區間最大值

引理:數論分塊

 

關於此處的數學規律,有這樣的定理技巧

給定正整數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] 的變形來節省時間。

對於每個區間,進行分塊操作,每次操作的時間複雜度也很奇妙。

五月了,任重道遠。