整除分塊思路

2021-10-08 18:30:34 字數 1582 閱讀 2483

求解 ∑i=

1n[n

i]

\sum_^n [\frac]

∑i=1n​

[in​

]一般思路 o(n) 求解

但用分塊可以達到 o(n

\sqrt

n​) 複雜度

理解:

為了避免每個 i 都計算一次,我們需要分塊

(i 不同時,有 k

kk 個 [ni

][\frac]

[in​

]仍然相同,將他們分為一塊,貢獻即為 k∗[

ni

]k*[\frac]

k∗[in​

])那麼問題關鍵就是 : 每一塊的 [ni

][\frac]

[in​

]係數 k是多少呢

舉個栗子:

n =8

n = 8

n=8對 i 分塊: [1]、[2]、[3,4]、[5,6,7,8] ;

分別對應的 [ni

][\frac]

[in​

] : 8、4、2、1;

首先不難知道

1.肯定是連續的分為一塊

2.對應的 [ni

][\frac]

[in​

] 可以用 n 除 每塊的開頭元素

那要確定如何分塊

因為開頭元素就是上乙個塊的末尾元素 + 1

所以 我們只要知道每塊的末尾元素就行了.

而每一塊的末尾元素就是整除的數(分界點,這個數之後 [ni

][\frac]

[in​

]就減小了)

那麼係數k就是末尾元素 - 開頭元素 + 1(塊長度)

**:

int

main()

cout << ans << endl;

return0;

}

最近遇到較為麻煩,但也只需要數學+整除分塊寫法的題目:hdu 6940 湘潭邀請賽-c題

思路不多贅述,比較考驗數學功底。

int t;

ll x1, y1, x2, y2,inv2 =

500000004

, inv6 =

166666668

;ll cal

(ll x)

pll solve

(ll x1, ll x2)

else

if(l / x1 +

1< r / x1)

}return

pll(sumx, fx);}

intmain()

return0;

}

整除分塊(數論分塊)

乙個有 趣的問題 求 sum n lfloor frac ni rfloor n leq 10 顯然不能直接做廢話 經過一番冷靜推理暴力打表 我們發現以下性質 1.large lfloor frac ni rfloor 最多只有 2 sqrt 種取值 證明 對於 i le sqrt,只有 sqrt ...

C Floor and Mod 分塊整除

題目 a b i,a b i a i b 1 對於乙個b可以配出幾個i就可以產生幾個貢獻 可以知道對於給出的x,y 取任意1 b y,乙個b產生的貢獻為min x b 1 b 1 當x b 1 b 1 時對於此時的b的貢獻全取b 1 當x b 1 b 1 時按x b 1 的貢獻,此時用整除分塊求解 ...

整除分塊思想

對於求形如 sum lfloor frac rfloor 的值,就需要用到整除分塊,否則當n很大時就會超時。在普通的乙個乙個的計算時可以發現很多 lfloor frac rfloor 的值成塊狀分布,最終的到的規律是發現對於每乙個值相同的塊,它的最後乙個數就是n n i for int l 1,r ...