题解见BZOJ1257
code:
import java.util.*;
import static java.lang.System.*;
import java.math.*;
//import
public class Main{
public static BigInteger mod = BigInteger.valueOf(1000000007);
public static void main(String[] args){
Scanner in = new Scanner(System.in);
// long k = in.nextLong();
long n = in.nextLong();
BigInteger t = BigInteger.valueOf(n).mod(mod);
t = t.multiply(t).mod(mod);
t = t.subtract(solve(n)).mod(mod).add(mod).mod(mod);
out.println(t);
in.close();
}
public static BigInteger solve(long t){
BigInteger ret = BigInteger.valueOf(0);
//boolean f = false;
for(long i = 1; i * i <= t; ++i){
long r = t / i;
BigInteger tmp = BigInteger.valueOf(r);
//out.println(tmp);
ret = ret.add(tmp.multiply(BigInteger.valueOf(i))).mod(mod);
//out.println(ret);
long l = t / (i + 1);
// long tt = min(k, r);
if(i != r) {
//long l = t / (i + 1);
BigInteger p = cal(r).subtract(cal(l)).multiply(BigInteger.valueOf(i));
ret = ret.add(p).mod(mod);
}
}
return ret;
}
public static long min(long a, long b){
return a <= b ? a : b;
}
public static BigInteger cal(long x){
BigInteger ret = BigInteger.valueOf(x);
BigInteger a = BigInteger.valueOf(x + 1);
BigInteger b = BigInteger.valueOf(2);
return ret.multiply(a).divide(b);
}
}