2013-11-15 21:55
原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1257
要求求sigma k mod i(i<=n)
那么我们可以转化为sigma k-(k div i)*i;
对于k div i,我们可以发现,对于k,i在递增时,k div i的值是递减且存在连续区间的,那么我们可以每次二分每个区间的首位,然后对于i用等差数列求和公式算就可以了(相当于把相等的k div i提出来),然后更新答案就好了
//By BLADEVIL var n, k :int64; i, j :longint; ans :int64; mid, r, l :int64; now, pi :int64; begin read(n,k); j:=n; ans:=n*k; while j>0 do begin now:=k div j; l:=1; r:=j; while l<=r do begin mid:=(l+r) div 2; if k div mid=now then begin pi:=mid; r:=mid-1; end else l:=mid+1; end; ans:=ans-now*(pi+j)*(j-pi+1) div 2; j:=pi-1; end; writeln(ans); end.