首页 > 其他 > 详细

【洛谷P2261】余数求和

时间:2019-03-14 22:58:32      阅读:140      评论:0      收藏:0      [点我收藏+]

题目大意:给定 n, k,求\(\sum\limits_{i=1}^n k\%n\) 的值。

题解:除法分块思想的应用。
\(x\%y=x-y\lfloor {x\over y}\rfloor\),因此只需快速求出 \(\sum\limits_{i=1}^n {k\over i}\) 即可。
引理:\(i\in [1,k], {k\over i}\) 最多只有不超过 \(2\sqrt k\) 个不同的值。(分情况讨论即可得出)
现在,只需找出每一段的起点和终点即可根据等差数列求和的方式来在 \(O(\sqrt(n))\) 的时间内求得答案。
引理:\(i\in [x,\lfloor k/{\lfloor k/x \rfloor}\rfloor]\) 时,\(k \over i\) 的值都相等。

代码如下

#include <bits/stdc++.h>
using namespace std;

long long n,k,ans;

int main(){
    scanf("%lld%lld",&n,&k);
    ans=n*k;
    for(int l=1,r;l<=n;l=r+1){
        r=k/l?min(k/(k/l),n):n;
        ans-=(k/l)*(l+r)*(r-l+1)/2;
    }
    printf("%lld\n",ans);
    return 0;
}

【洛谷P2261】余数求和

原文:https://www.cnblogs.com/wzj-xhjbk/p/10534135.html

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