AcWing 199. 余数之和

解题思路:附大佬博客:https://www.acwing.com/solution/content/6702/ 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
long long l,r,n,k;
int main()
{
    cin>>n>>k;
    long long ans=n*k;
    for(l=1;l<=n;l=r+1)//l记录的是一段k/x相同的x的左端点,r是右端点,即当x属于[l,r]时,k/x的值保持相同
    {
        if(k/l==0)
        break;
        r=min(k/(k/l),n);//这里主要要和n取一个最小值,因为如果r大于n了就没有意义了,而且会对结果产生影响,会使结果变大
        ans-=(k/l)*(l+r)*(r-l+1)/2;//(r-l+1)表示一段k/x值相同的x的个数,因为要减去的是对l<=i<=r,k/i*i的求和,因为我们这里是直接算的一段,这里后面成的i变成了l和r的中点,即(l+r)/2
        //这里需要注意的一点是/2要放在最后,如果放在前面会导致答案不准确
    }
    printf("%lld\n", ans);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值