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

 

posted @ 2019-06-04 11:49  LuitaryiJack  阅读(216)  评论(0编辑  收藏  举报