题意
给出正整数
n
和
1≤n,k≤109
思路
ans=∑i=1nk%i=∑i=1nk−⌊ki⌋×i=nk−∑i=1n⌊ki⌋×i
因为后面一项的前缀和可以维护,所以总的复杂度是 O(n−√)
代码
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
long long res, n, k, last;
int main(){
scanf("%lld%lld", &n, &k);
res += n*k;
n = min(n, k);
for(long long i = 1; i <= n; i = last+1){
last = min(n, k/(k/i));
res -= (k/i)*(i+last)*(last-i+1)/2;
}
printf("%lld", res);
return 0;
}