首页 > 其他 > 详细

题解P2261

时间:2020-06-26 22:44:54      阅读:70      评论:0      收藏:0      [点我收藏+]

原题传送门

最重要的事:long long!!!!!!

首先,题目要求的是\(res=\sum\limits_{i=1}^{n}k\%i\)

可以把\(k\%i\)转化为\(k-i\times\left\lfloor\dfrac{k}{i}\right\rfloor\)

证明:\(\left\lfloor\dfrac{k}{i}\right\rfloor\)是向下取整,所以将小数点部分都去掉,去掉\(\dfrac{k\%i}{i}\)的值

所以\(\left\lfloor\dfrac{k}{i}\right\rfloor=\dfrac{k-k\%i}{i}\)

所以\(k\%i=k-(k-k\%i)=k-i\times\dfrac{k-k\%i}{i}=k-i\times\left\lfloor\dfrac{k}{i}\right\rfloor\)

然后,写代码了:

#include<iostream>
using namespace std;
typedef long long ll;
ll n,k,res;
inline void solve(){
    res=n*k,n=min(n,k);//当i>k时,k/i为0,会/0,故取min
    ll i=1,j;
    while(i<=n){
        j=min(k/(k/i),n);//这里可能会超过n,所以取min
        res-=(k/i)*(j-i+1)*(i+j)>>1;
        i=j+1;
    }
    cout<<res;
}
int main(){
    cin>>n>>k;
    solve();
    return 0;
}

P.S.这个题要注意的地方挺多,有意思的一道题

题解P2261

原文:https://www.cnblogs.com/RadestionAdtinium/p/13196563.html

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