计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值
solution
k < i,取模值相同都为k,对答案贡献为 (n−k)∗k。
k = i,对答案贡献为0。
k > i,贡献为∑ (k - ⌊k/i⌋*i) ,⌊k/i⌋相等的数是连续的一段, 此时这段连续的数对答案的贡献成等差数列。(当时这里好像是抄的?。。占坑待填)
codes
#include<iostream>usingnamespacestd;
typedeflonglong LL;
int main(){
int n, k;
cin>>n>>k;
LL ans = 0;
if(n > k)ans=(LL)k*(n-k), n=k-1;
for(int i = 1; i <= n; i++){
int t = k/i, r = (t?k/t:n);
if(r > n)r = n;
ans += (LL)k*(r-i+1)-(LL)t*(i+r)*(r-i+1)/2;
i = r;
}
cout<<ans<<'\n';
return0;
}