首页 > Windows开发 > 详细

AcWing 199. 余数之和【整除分块】

时间:2020-05-25 10:55:28      阅读:69      评论:0      收藏:0      [点我收藏+]

传送门

题解

\[ans=\sum_{i=1}^nk\ mod\ i=\sum_{i=1}^{n}k-\lfloor k/i\rfloor*i=n*k-\sum_{i=1}^n\lfloor k/i\rfloor *i \]

其中 \(\sum_{i=1}^n\lfloor k/i\rfloor *i\) 可以用整除分块在 \(O(\sqrt{k})\) 的时间复杂度内求出来。

代码

int n,k;
LL ans;

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

AcWing 199. 余数之和【整除分块】

原文:https://www.cnblogs.com/BakaCirno/p/12955503.html

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