∑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。...