[BZOJ]1257 [CQOI2007] 餘數之和sum 分塊優化

1257: [CQOI2007]餘數之和sum

Time Limit: 5 Sec  Memory Limit: 162 MB
Submit: 5175  Solved: 2404
[Submit][Status][Discuss]

Description

給出正整數n和k,計算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的餘數。例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3 mod 5=0+1+0+3+3=7

Input

輸入僅一行,包含兩個整數n, k。

Output

輸出僅一行,即j(n, k)。

Sample Input

5 3

Sample Output

7

HINT

50%的數據滿足:1<=n, k<=1000 100%的數據滿足:1<=n ,k<=10^9

Source

[Submit][Status][Discuss]


HOME Back

  挺好的一道數論題... 發現%確實不好做, 於是考慮%的另一種形式就是a%b = a - (a / b) * b, 那麼答案就等於sigma k - (k / i) * i (1 <= i <= n). 那麼發現後面那個向下取整的除法只有根號種取值, 於是分塊優化即可.

#include<bits/stdc++.h>
using namespace std;
int n, k, lim;
long long ans;
int main() {
	scanf("%d%d", &n, &k);
	lim = min(n, k);
	for (int i = 1, dd; i <= lim; i = dd + 1) {
		dd = min(k / (k / i), lim);
		ans += 1ll * (k / i) * (i + dd) * (dd - i + 1) / 2;
	}
	printf("%lld\n", 1ll * n * k - ans);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章