前兩天肝了整整兩天的fft,部落格暫咕
今天打算先肝個莫隊,於是複習一下整除分塊
題面:給出n,k
(1≤n
,k≤1
09
)n,k(1\le n,k\le 10^9)
n,k(1≤
n,k≤
109)
,求∑i=1
nkmo
di
\large\sum\limits_^k\mod i
i=1∑n
kmod
i推一波公式:
∑ i=
1nkm
odi=
∑i=1
nk−i
∗⌊ki
⌋=nk
−∑i=
1ni∗
⌊ki⌋
\begin &\sum\limits_^k\mod i\\ =&\sum\limits_^k-i*\lfloor\frac\rfloor\\ =&nk-\sum\limits_^i*\lfloor\frac\rfloor\\ \end
==i=1
∑nk
modi
i=1∑
nk−
i∗⌊i
k⌋n
k−i=
1∑n
i∗⌊i
k⌋
推到這裡,觀察一下⌊ki
⌋\lfloor\frac\rfloor
⌊ik
⌋,發現:到了後面i
ii大的時候⌊ki
⌋\lfloor\frac\rfloor
⌊ik
⌋可能會保持不變!
重點來看⌊ki
⌋\lfloor\frac\rfloor
⌊ik
⌋會在什麼區間內保持不變:
設⌊ ki
⌋=⌊k
j⌋=q
(i
\lfloor\frac\rfloor=\lfloor\frac\rfloor=q~(i⌊i
k⌋=
⌊jk
⌋=q(
i則有q i+
x=qj
+y=k
(0≤x
0≤
y
qi+x=**+y=k~(0\le xqi
+x=q
j+y=
k(0≤
x0≤y最極端的情況便是y=0
y=0y=
0則qi+x
=qj=
kqi+x=**=k
qi+x=q
j=k肉眼可見j=k
qj=\frac
j=qk
考慮到可能q∤j
q\nmid j
q∤j所以j=⌊
kq
⌋j=\lfloor\frac\rfloor
j=⌊qk
⌋對於每乙個x
xx,它所在的⌊ki
⌋\lfloor\frac\rfloor
⌊ik
⌋區間上界就是k⌊k
x⌋
\frac\rfloor}
⌊xk⌋k
這樣就可以通過等差數列對每一塊的i∗⌊
ki
⌋i*\lfloor\frac \rfloor
i∗⌊ik
⌋進行計算了
每塊計算公式:
( l+
r)∗(
r−l+
1)2∗
(k/l
)\frac*(k/l)
2(l+r)
∗(r−
l+1)
∗(k
/l)肉眼可見初始塊一定是[1,
1]
[1,1]
[1,1
]遞推式:r=⌊
k⌊kl
⌋⌋,l
=r+1
r=\lfloor\frac\rfloor}\rfloor,l=r+1
r=⌊⌊lk
⌋k
⌋,l=
r+1
有乙個細節:
如果l
>
kl>k
l>
k,那麼⌊ki
⌋=
0\lfloor\frac\rfloor=0
⌊ik⌋=
0,會導致除以零
由此我們要加乙個特判
這就是整除分塊的一種#include
using
namespace std;
inline
intmin
(const
int a,
const
int b)
intmain()
洛谷P2261 CQOI2007 餘數求和
傳送門 題目背景 數學題,無背景 題目描述 給出正整數 n,k計算k取模1 n的和 數學好題,短小精悍 暴力能60,之後考慮優化。如果你學過一點點數學,那麼你就知道 k i k k i i 而且不難發現,k i 必定是連續的,且在一定的i的範圍內這個值是不變的,類似於乙個階梯函式,而我們闊以通過k ...
洛谷P2261 CQOI2007 餘數求和
給出正整數n和k,計算g n,k k mod 1 k mod 2 k mod 3 k mod n的值,其中k mod i表示k除以i的餘數。例如g 10,5 5 mod 1 5 mod 2 5 mod 3 5 mod 4 5 mod 5 5 mod 10 0 1 2 1 0 5 5 5 5 5 29...
P2261 CQOI2007 餘數求和
數學題,無背景 給出正整數n和k,計算g n,k k mod 1 k mod 2 k mod 3 k mod n的值,其中k mod i表示k除以i的餘數。例如g 10,5 5 mod 1 5 mod 2 5 mod 3 5 mod 4 5 mod 5 5 mod 10 0 1 2 1 0 5 5 ...