數論基礎之分塊

2021-09-27 08:45:14 字數 2551 閱讀 7645

∑i=

1n⌊n

i⌋

\sum_^n\rfloor}

∑i=1n​

⌊in​

⌋暴力?

1.顯然可以使用o(n

)o(n)

o(n)

的做法暴力過去,但是資料大了肯定就涼了

2.如果取n=10的話

可以發現n/i

n/in/

i的值分別是10,5,3,2,2,1,1,1,1,1

這些相同的數字豈不是可以使用區間長度×相同的數字來直接計算嗎,然後遍歷過程中就能把變數i直接移到下乙個位置(具體是**後續會解釋)

現在給出乙個左端點i,那麼它的最大右端點i

1i_1

i1​是多少,可以使得對於任意的(i≤

x≤i1

)(i\leq x \leq i_1)

(i≤x≤i

1​),都有⌊nx

⌋=⌊n

i⌋

\lfloor \rfloor=\lfloor \rfloor

⌊xn​⌋=

⌊in​

證明(顯然不是自己會證明的 ):

設⌊ ni

⌋=

k\lfloor \rfloor=k

⌊in​⌋=

k,則根據定義可以寫成n=k

i+r,

(0≤r

n=ki+r,(0\leq rn=

ki+r

,(0≤

r設⌊ ni

+d⌋=

k\lfloor } \rfloor=k

⌊i+dn​

⌋=k,同理可得n=k

i+kd

+r1,

(0≤r

1

n=ki+kd+r_1,(0\leq r_1n=

ki+k

d+r1

​,(0

≤r1​

顯然我們只需求出dma

x=⌊r

−r1k

⌋=⌊r

k⌋

d_=\lfloor \over k} \rfloor=\lfloor\rfloor

dmax​=

⌊kr−

r1​​

⌋=⌊k

r​⌋合併同類項後得?

其實迴圈的次數就是⌊ni

⌋\lfloor \rfloor

⌊in​

⌋的不同的值的個數,即分塊的個數

那麼有多少個不同的數,對於乙個n,可以分成兩種情況考慮:

1.當i≤n

i\leq \sqrt

i≤n​

的時候,最多也只有i的範圍長度即n

\sqrt

n​種可能性

2.當i

>

ni>\sqrt

i>n​

時,⌊ ni

⌋<

n\lfloor \rfloor <\sqrt

⌊in​

⌋,最多只有範圍長度n

\sqrt

n​種情況綜上,分塊個數不會超過2

n2\sqrt

2n​個,即時間複雜度o(n

)o(\sqrt)

o(n​)

ll ans=0;

for(

int l=

1,r=

0;l<=n;l=r+1)

//每次左端點在前乙個區間的右端點的下乙個位置r+1

1.洛谷 p1403 板子題

題意:求出1-n的每個數的因數總和

做法:實際上並不用打表算,只要算∑i=

1n⌊n

i⌋

\sum_^n\rfloor}

∑i=1n​

⌊in​

⌋,即找出n個數中有多少個數字是含有因數i的,例如7/3=2,所以3和6是含有因數3的,則答案就加上2

int

main()

ww(ans)

;return0;

}

2.[cqoi2007]餘數求和

題意:給出n,k,求∑i=

1n(k

modi

)\sum_^n(k \ mod \ i)

∑i=1n​

(kmo

di)做法:考慮到模數並不能直接套,於是進行如下轉化

這就很好做了,將⌊ki

⌋\lfloor \rfloor

⌊ik​

⌋的值相同的分為一塊,然後(l≤

i≤r)

(l\leq i \leq r)

(l≤i≤r

)就相當於是乙個✖上乙個定值的等差數列了

for

(ll i=

1,r;i<=n;i=r+1)

尚不深究……

數論 數論分塊

求解圖中紅點和綠點的總數之和。求 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。...