題面
這道題用到了數論分塊
首先什麼是數論分塊 顧名思義就是分塊在數論上的應用
不過非常神奇的一點是你如果不會分塊但你還是可以會數論分塊的
所求為∑i=
1nkm
od
i\sum_^k mod i
i=1∑n
kmod
i將這個式子改為:
∑ i=
1nk−
i×(⌊
ki⌋)
\sum_^k-i×(\left \lfloor \frac \right \rfloor)
i=1∑n
k−i×
(⌊ik
⌋)前面的n×k
n×kn×
k直接先算出來
後面的i
ii是單增的
而⌊ ki
⌋\left \lfloor \frac \right \rfloor
⌊ik
⌋在一段範圍內是相等的 總共只有2
n2\sqrt
2n種取值
因此,每次求出這一段範圍,直接計算等差數列即可
#includeusing namespace std;
inline int read()
long long ans,n,k;
int main()
printf("%lld\n",ans);
return 0;
}
數論分塊推薦一道題:尤拉心算(bz
oj
4804
)(bzoj4804)
(bzoj4
804)
具體在這篇部落格中哦!
數論2333
2333
2333
CQOI2007 餘數求和
求 ans k 1 k 2 k n 這題目應該算是數論裡比較簡單的了 求 ni 1 kmod i i 1nkm od i我們知道 a b a b a b 即 ni 1 kmod i n i 1 k i k i n k ni 1 i k i i 1nkm odi i 1 n k i k i n k i...
CQOI2007 餘數求和
傳送門 或許這也算是道神仙題?題目描述非常直白,我們把式子轉化一下,其實就是求n k k i i。而k i是可以使用除法分塊來做的 假設t k i,如果t 0,那麼它的末端就是n,這個很顯然,如果不等於0的話,那麼末端就是k t。之後我們就神奇的過了這道題 極短。include include in...
CQOI2007 餘數求和
給出n,k求k 1 n每乙個數的和 首先將原始式子變形成為nk k 1 1 k 2 2.k n n 此處的除法都是向下取整,也就是說不可以使用運算律了。那麼我們通過簡化式子,得到了乙個不能用運算律的式子。此時我們發現不能暴力去算他。於是嘗試著找了一會規律,可得到乙個 以100為例 相同的用顏色標記出...