1257: [CQOI2007]余数之和sum
Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 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
挺好的一道数论题... 发现%确实不好做, 于是考虑%的另一种形式就是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);
}