首页 > Windows开发 > 详细

Acwing199 余数之和

时间:2019-12-28 10:37:40      阅读:79      评论:0      收藏:0      [点我收藏+]

原题面:https://www.acwing.com/problem/content/201/

题目大意:给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值。例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3 mod 5=0+1+0+3+3=7。

输入描述:输入仅一行,包含两个整数n, k。

输出描述:输出仅一行,即j(n, k)。

输入样例:

5 3

输出样例:

7                            

分析:k%i=k-[k/i]i,所以原式可以化简为nk-(1<=i<=n)[k/i]*i。反正最后划来划去可以得到[x,[k/[k/x]]]区间内,[k/i]的值都相等。最后就是多个等差数列求和的问题。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
    ll n, k;
    scanf("%lld%lld", &n, &k);
    ll ans = n * k;
    for (int x = 1, gx; x <= n; x = gx + 1) {
        gx = k / x ? min(k / (k / x), n) : n;
        //[x,[k/[k/x]]]
        ans -= (k / x) * (x + gx) * (gx - x + 1) / 2;//第一项为(k/x)*x*(gx-x+1),最后一项为(k/x)*gx*(gx-x+1),此为一个等差数列区间
    }
    cout << ans << endl;
    return 0;
}

Acwing199 余数之和

原文:https://www.cnblogs.com/SwiftAC/p/12110792.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!