洛谷P2261 CQOI2007 餘數求和

2022-08-13 23:54:10 字數 1199 閱讀 6996

給出正整數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

輸入格式:

兩個整數n k

輸出格式:

答案輸入樣例#1:

10 5
輸出樣例#1:

29
30%: n,k <= 1000

60%: n,k <= 10^6

100% n,k <= 10^9

題解:這差不多是道數學題吧

看樣例發現對與n大於k的的部分,k模它的餘數一定為k

那麼只需考慮k以內的了

k%x可以寫成k=a*x+r,模出來的值其實就是r

我想,當x與k很接近時,當x增大時a基本上變化很小。在確定a不變的情況下r隨x增加而發生的變化是很好計算的,就是個等差數列嘛!

而顯然若a能基本不變那麼a一定很小,其小於大的分界線便是sqrt(n)

如果不太理解可以自己試試數算一下,比如48、49之類的

對於a>sqrt(n),也就是x之後便從sqrt(n)到1列舉a,由於在a不變時餘數就是個等差數列,那麼知道數列的個數與首項、公差就可以求和了。公差由k=a*x+r可知就是a

之後就可以了,這題的細節有點多,需要注意一下

總結一下思路:

發現只需考慮k以內的 -> 由餘數想到除,由除想到反比例函式增長快慢sqrt(n)可做分界線 -> 分類討論發現餘數的規律 -> 注意細節進行計算

**:

1 #include2 #include3 #include4 #include5

using

namespace

std;

67 typedef long

long

ll;8

intn,k;

9 ll ans=0;10

11int

main()

1229 last=w;30}

31 printf("

%lld

",ans);

3233

return

0;

34 }

view code

洛谷 P2261 CQOI2007 餘數求和

前兩天肝了整整兩天的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推一波...

洛谷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 ...