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
Sample Output
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);
}