除法分块学习——P2261 [CQOI2007]余数求和
独立想出了一道蓝题还是很开心的
但是修锅真的难受
以后一定要多测测极限数据,以及跟暴力对拍,看中间值
强调一点:不开longlong见祖宗
可我写的很奇怪啊 用的是while
有空看看大众是怎么写的
#include<cstdio>
#define int long long
inline int min(int x,int y){return x<y?x:y;}
int n,k,now,ans;
signed main(){
scanf("%lld%lld",&n,&k);
if(n>k)ans+=k*(n-k),n=k;
int l=k+1,r;
do{
// if((k/l)%10000==0)
// printf("%I64d %I64d %I64d %I64d\n",now,l,r,k/l);
now=k/(l-1);
r=l-1;
l=k/(now+1)+1;
// printf("%I64d %I64d %I64d %I64d\n",now,l,r,k/l);
// printf("%d %d\n",l,r);
if(l<=r){
if(l<=n)r=min(r,n);
if(r<=n)ans+=(r-l+1)*k-(k/l)*(l+r)*(r-l+1)/2;
}
}while(l>1);
printf("%lld\n",ans);
}