// ~~ icebear ~~
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int, int> ii;
typedef pair<ii, int> iii;
#define FOR(i,a,b) for(int i=a; i<=b; ++i)
#define FORR(i,a,b) for(int i=a; i>=b; --i)
#define rep(i, n) for(int i=0; i<n; ++i)
#define red(i, n) for(int i=n-1; i>=0; --i)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define task "icebearat"
const int MOD = 1e9 + 7;
const int inf = 1e9 + 27092008;
const ll LLinf = 1e18 + 27092008;
int pw(int x, int k){
int res = 1;
while(k){
if (k & 1) res = res * x % MOD;
x = x * x % MOD;
k >>= 1;
}
return res;
}
int sum(int l, int r){ // tính tổng từ l -> r
l %= MOD;
r %= MOD;
// pw(2, MOD - 2) : nghịch đảo modulo. 1/a = a^(-1) đồng dư với a^(MOD - 2) theo modulo MOD
return (r * (r + 1) % MOD * pw(2, MOD - 2) % MOD - l * (l - 1 + MOD) % MOD * pw(2, MOD - 2) % MOD + MOD) % MOD;
}
int solve1(int n){
int l = 1, res = 0;
while(l <= n){
int k = n / l;
int r = n / k;
res = (res + k * sum(l, r) % MOD) % MOD;
l = r + 1;
}
return res;
}
void solve(){
int n; cin >> n;
cout << solve1(n);
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
if (fopen(task".inp", "r")){
freopen(task".inp", "r", stdin);
freopen(task".out", "w", stdout);
}
int tc = 1;
// cin >> tc;
while(tc--) solve();
return 0;
}
Ly8gfn4gaWNlYmVhciB+fgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBpbnQgbG9uZyBsb25nCgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsKdHlwZWRlZiBwYWlyPGlpLCBpbnQ+IGlpaTsKCiNkZWZpbmUgRk9SKGksYSxiKSBmb3IoaW50IGk9YTsgaTw9YjsgKytpKQojZGVmaW5lIEZPUlIoaSxhLGIpIGZvcihpbnQgaT1hOyBpPj1iOyAtLWkpCiNkZWZpbmUgcmVwKGksIG4pIGZvcihpbnQgaT0wOyBpPG47ICsraSkKI2RlZmluZSByZWQoaSwgbikgZm9yKGludCBpPW4tMTsgaT49MDsgLS1pKQojZGVmaW5lIG1wIG1ha2VfcGFpcgojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgdGFzayAiaWNlYmVhcmF0IgoKY29uc3QgaW50IE1PRCA9IDFlOSArIDc7CmNvbnN0IGludCBpbmYgPSAxZTkgKyAyNzA5MjAwODsKY29uc3QgbGwgTExpbmYgPSAxZTE4ICsgMjcwOTIwMDg7CgppbnQgcHcoaW50IHgsIGludCBrKXsKCWludCByZXMgPSAxOwoJd2hpbGUoayl7CgkJaWYgKGsgJiAxKSByZXMgPSByZXMgKiB4ICUgTU9EOwoJCXggPSB4ICogeCAlIE1PRDsKCQlrID4+PSAxOwoJfQoJcmV0dXJuIHJlczsKfQoKaW50IHN1bShpbnQgbCwgaW50IHIpeyAvLyB0w61uaCB04buVbmcgdOG7qyBsIC0+IHIKCWwgJT0gTU9EOwoJciAlPSBNT0Q7CgkvLyBwdygyLCBNT0QgLSAyKSA6IG5naOG7i2NoIMSR4bqjbyBtb2R1bG8uICAxL2EgPSBhXigtMSkgxJHhu5NuZyBkxrAgduG7m2kgYV4oTU9EIC0gMikgdGhlbyBtb2R1bG8gTU9ECglyZXR1cm4gKHIgICogKHIgKyAxKSAlIE1PRCAqIHB3KDIsIE1PRCAtIDIpICUgTU9EIC0gbCAqIChsIC0gMSArIE1PRCkgJSBNT0QgKiBwdygyLCBNT0QgLSAyKSAlIE1PRCArIE1PRCkgJSBNT0Q7Cn0KCmludCBzb2x2ZTEoaW50IG4pewoJaW50IGwgPSAxLCByZXMgPSAwOwoJd2hpbGUobCA8PSBuKXsKCQlpbnQgayA9IG4gLyBsOwoJCWludCByID0gbiAvIGs7CgkJcmVzID0gKHJlcyArIGsgKiBzdW0obCwgcikgJSBNT0QpICUgTU9EOwoJCWwgPSByICsgMTsKCX0KCXJldHVybiByZXM7Cn0KCnZvaWQgc29sdmUoKXsKCWludCBuOyBjaW4gPj4gbjsKCWNvdXQgPDwgc29sdmUxKG4pOwp9CgpzaWduZWQgbWFpbigpewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsKICAgIGNpbi50aWUoMCk7IGNvdXQudGllKDApOwogICAgaWYgKGZvcGVuKHRhc2siLmlucCIsICJyIikpewogICAgICAgIGZyZW9wZW4odGFzayIuaW5wIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3Blbih0YXNrIi5vdXQiLCAidyIsIHN0ZG91dCk7CiAgICB9CiAgICBpbnQgdGMgPSAxOwovLyAgICAgY2luID4+IHRjOwogICAgd2hpbGUodGMtLSkgc29sdmUoKTsKICAgIHJldHVybiAwOwp9Cg==