BZOJ 1257 [CQOI2007]余数之和 数学

都不知道说什么好。。。咕咕到现在。。


求:$\sum_{i=1}^n \space k\space mod \space i$

即求:$n*k-\sum_{i=1}^n\space \lfloor \frac{k}{i} \rfloor *i$

我们发现,在一定范围内,$\lfloor \frac{k}{i} \rfloor$是不变的,那么此时相当于求一个等差数列。。。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define ll long long
#define R register ll
static char B[1<<15],*S=B,*D=B;
#define getchar() (S==D&&(D=(S=B)+fread(B,1,1<<15,stdin),S==D)?EOF:*S++)
using namespace std;
inline ll g() {
    R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix;
    do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
} ll n,k,ans;
signed main() {
    n=g(),k=g(); ans=n*k; for(R l=1,r=0;l<=n;l=r+1) {
        if(k/l) r=min(n,k/(k/l));//求出左右边界
        else r=n;
        ans-=(k/l)*(r-l+1)*(l+r)>>1;
    } printf("%lld\n",ans);
}

2019.06.04

 

转载于:https://www.cnblogs.com/Jackpei/p/10972682.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值