余数之和(O(sqrt(K)))

余数之和(O(sqrt(K)))

k mod i = k - floor(k/i)*i

image-20230205125843598

等差数列求和公式

image-20230205130427321

#include<bits/stdc++.h>
using namespace std;
long long n,k,ans;
int main()
{
    cin >> n>> k;
    ans = n * k; // 这里先把公式里的"k-"放在这里
    for(int x = 1, gx;x <= n; x = gx + 1)
    {
        gx = k/x ? min(k/(k/x), n) : n; // 这里,正常来说就是k/(k/x),但要考虑到n大于k的情况,那时,x就会大于k,以及考虑最后一个的情况,也就是要尾项为n
        ans -= (k/x) * (x + gx) * (gx - x + 1) / 2;//这里,(k/x)*x为首项,(k/x)*gx为尾项,(gx-x+1)为项数,通过套用等差数列求和公式可得上式
    }
    cout << ans;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值