除法分块学习——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);
}
posted @ 2019-11-13 10:39  Y15BeTa  阅读(150)  评论(0编辑  收藏  举报