表达式的值(exp)

题意:

请计算 n mod 1 + n mod 2 +…+ n mod n 的值。 n<1000000000

思路:

反演问题???听说是这个,他们说很简单… 不过我还是看了题解…. 大概思路就是先化简试子。 n mod i=n-i*(n div i)然后n dvi i 其实就只有n的开方个结果,分成根号n个区域,就可以先求出每个区域的分界点,然后用等差数列求和什么的。就可以写出来了。

程序:

var n,l,r,last:int64; sum:int64; function min(x,y:int64):int64; begin if x<y then exit(x) else exit(y); end; begin assign(input,'exp.in'); reset(input); assign(output,'exp.out'); rewrite(output); readln(n); l:=1; sum:=n*n; while (l<=n) do begin last:=min(n div (n div l),n); sum:=sum-((n div l)*(last-l+1)*((l+last)) div 2); l:=last+1; end; writeln(sum); close(input); close(output); end.