ACwing 199 约数之和

题意:

给出正整数$n$和$k$,计算$k mod 1 + k mod 2 + k mod 3 + … + k mod n$的值。

思路:

已知$k mod n = k - k / n * n$,因此答案要求$n * k - k / 1 * 1 - k / 2 * 2 - ... - k / n * n$,用整数分块即可

Code:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

typedef long long ll;

#define sd(a) scanf("%d", &a)
#define sdd(a, b) scanf("%d%d", &a, &b)

int n, k, en;
ll ans;

void solve(){
    sdd(n, k);
    ans = (ll)n * k;
    for(int i = 1; i <= min(n, k); i = en + 1){
        en = min(n, k / (k / i));
        ll p = en - i + 1;
        ans -= k / i * (p * i + p * (p - 1) / 2);
    }
    printf("%lld\n", ans);
    
}

int main(){
    int T = 1;
    // sd(T);
    while(T --){
        solve();
    }
    
    return 0;
}

 

posted @ 2020-08-04 15:41  君顾  阅读(144)  评论(0编辑  收藏  举报