P2261 [CQOI2007]余数求和

P2261 [CQOI2007]余数求和

分析

求的式子为ans=i=1nk%i,我们首先需要知道的是a%b=abab,则式子就变成了。

ans=nki=1niki

然后ki,可以用整数分块做,这样时间复杂度就降到k

中间有一些小的限制,我会在代码中写出来。

Ac_code

#include<bits/stdc++.h>

using namespace std;
typedef long long LL;

int g(int x,int l)//边界为x,该块边界为l
{
    return x/(x/l);
}

int main()
{
    int n,k;cin>>n>>k;
    LL ans = 0;
    if(n>k)
    {
        ans += 1ll*(n-k)*k;
        n = k;
    }
    ans += 1ll*n*k;
    for(int l=1,r;l<=n;l=r+1)
    {
        r = min(g(k,l),n);
        ans -= 1ll*(l+r)*(r-l+1)/2*(k/l);
    }
    cout<<ans<<'\n';
    return 0;
}

本文作者:艾特玖

本文链接:https://www.cnblogs.com/aitejiu/p/16656475.html

版权声明:本作品采用艾特玖许可协议进行许可。

posted @   艾特玖  阅读(28)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起