【CQOI2007】【BZOJ1257】余数之和

problem

  • 给出正整数n和k
  • 计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值

solution

  • k < i,取模值相同都为k,对答案贡献为 (nk)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;
}
posted @ 2018-05-28 19:20  gwj1139177410  阅读(97)  评论(0编辑  收藏  举报
选择