問題:
當我們暴力的時候時間複雜度為o(n),但是我們可以把時間複雜度降到o(sqrt(n)),這點時間優化在數論中可是不能小視的。
除法分塊
所謂分塊,就是把一段數分成不同的區間,而這些區間的每乙個數除以同乙個數的值是相同的,所以我們就把這些區間統一處理,就不用再來乙個乙個遍歷
例: 問題中我們假設n = 10。那麼我們現在分一下,,,,,分別分成這幾塊因為他們除以n的值是相等的
那麼我們用**怎麼分呢?
先貼模板:
ll l =
1,r,n;
cin >> n;
while
(l <= n)
我們知道初始l肯定是等於1,每次算到了r後,再把l更新到r + 1即可。那麼關鍵是r怎麼確定?
先一步一步解釋: (n / l)代表的是值為(n / l)的一類數的評定標準,也是這個區間的每乙個數對答案的增長的價值。
那麼n / (n/l),就是代表這一類數的最大值(也就是右端點r)
為什麼?抱歉這裡我真的表達不出來,是和除法的性質相關
只要是形如這種型別的,都可以用除法分塊去做
數論 數論分塊
求解圖中紅點和綠點的總數之和。求 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 ...
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...