今天的模擬賽裡t2要使用到數論分塊,裡面有乙個重要的坎就是關於r=sum/(sum/l)的證明,網上關於這道題的題解裡都沒有關於這個的證明,那麼我就來填補一下:
在以下的文章裡,我都會使用lo(x)表示對x向下取整,同理up(x)表示對x向上取整;
我們要求左右區間的邊界,那麼我們就不妨設 取兩個數 i 和 i『 使得lo(n/i')==lo(n/i)則,我們就可以證明
設 lo(n/i)=k;則有 k*i+p=n (p一定有 0<=p所以 : p'=n-k*i-k*d ;
因為 p=n-k*i;
so p'=p-k*d;
because k*d=n-k*i-p'=p-p' also because 0<=p<=i
so k*d+p'=p -> d(max)=lo(p/k); (this can make each other !)
because i'=i+d(max)=i+lo(p/k)=i+lo((n%i)/(n/i));
-> i+lo((n-lo(n/i)*i)/lo(n/i));
->lo(i+lo((n-lo(n/i)*i)/lo(n/i)));
->lo((lo(n/i)*i)/lo(n/i)+((n-lo(n/i)*i)/lo(n/i)));
->lo(n/lo(n/i));
證明完畢!!(學校輸入法真的難使,我也不想打英文的!)
更加帥氣的證明:
設floor(x)表示小於等於x的最大整數,那麼若有 floor(n/i)=floor(n/i') ,則i'的最大值為floor(n/floor(n/i));
證明:我們設 floor(n/i)=k ,顯然一定有整數p∈[0,i)滿足 k*i+p=n ;
則 p=n-k*i ;
設 d=i-i';
若有整數p'滿足 k=floor(n/(i+d)),n=k*(i+d)+p',
那麼p'=(n-k*i)-k*d=p-k*d,即 k*d=p'-p;
又∵ p∈[0,i) ∴當d取得最大值dmax時 k*dmax+p'=p,dmax=floor(p/k);
i'=i+dmax
=i+floor(p/k)
=i+floor((n%i)/(n/i))
=i+floor((n-floor(n/i)*i)/floor(n/i))
=floor(i+floor((n-lo(n/i)*i)/floor(n/i)))
=floor((floor(n/i)*i)/floor(n/i)+((n-floor(n/i)*i)/floor(n/i)))
=floor(n/floor(n/i))
即 i'=floor(n/floor(n/i));
得證 。
數論 數論分塊
求解圖中紅點和綠點的總數之和。求 sum k space mod space i 如果縱軸的x乙個點乙個點進行移動的話,將會非常緩慢。k i k fraci times i 於是有 sum k space mod space i sum k fraci times i n times k sum i...
整除分塊(數論分塊)
乙個有 趣的問題 求 sum n lfloor frac ni rfloor n leq 10 顯然不能直接做廢話 經過一番冷靜推理暴力打表 我們發現以下性質 1.large lfloor frac ni rfloor 最多只有 2 sqrt 種取值 證明 對於 i le sqrt,只有 sqrt ...
除法分塊 數論
問題 當我們暴力的時候時間複雜度為o n 但是我們可以把時間複雜度降到o sqrt n 這點時間優化在數論中可是不能小視的。除法分塊 所謂分塊,就是把一段數分成不同的區間,而這些區間的每乙個數除以同乙個數的值是相同的,所以我們就把這些區間統一處理,就不用再來乙個乙個遍歷 例 問題中我們假設n 10。...