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