problem
- 给出正整数n和k
- 计算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>
using namespace std;
typedef long long 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';
return 0;
}