#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target("avx2,tune=native")
#include <bits/stdc++.h>
using namespace std;
#define ff(i, a, b) for(auto i=(a); i<=(b); ++i)
#define ffr(i, b, a) for(auto i=(b); i>=(a); --i)
#define nl "\n"
#define ss " "
#define mp make_pair
#define pb emplace_back
#define fi first
#define se second
#define sz(s) (int)s.size()
#define all(s) (s).begin(), (s).end()
#define ms(a,x) memset(a, x, sizeof (a))
#define cn continue
#define re exit(0)
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<pii> vpii;
typedef vector<pll> vpll;
const int mod=1e9+7;
const int mod2=998244353;
const int maxn=1e5+105;
const int maxm=4*maxn+5;
const ll inf=1e16;
void rf(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
if(fopen("o.in","r")){
freopen("o.in","r",stdin);
freopen("o.out","w",stdout);
}
}
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll ran(ll l, ll r)
{
return uniform_int_distribution<ll> (l, r)(rng);
}
template <typename T> void add(T &x, const T &y)
{
x+=y;
if(x>=mod) x-=mod;
if(x<0) x+=mod;
}
template <typename T> bool maxi(T &a, T b)
{
if(a>=b) return 0;
a=b; return 1;
}
template <typename T> bool mini(T &a, T b)
{
if(a<=b) return 0;
a=b; return 1;
}
signed main()
{
rf();
ll n; cin>>n;
ll ans=0;
ll cur=1;
ll inv2 = 500000004;
while(cur<=n)
{
ll id = n / (n / cur);
ll sum_i = ((id + cur) % mod) * ((id - cur + 1) % mod) % mod;
sum_i = sum_i * inv2 % mod;
ll cnt = n / cur;
cnt = (cnt % mod) * ((cnt + 1) % mod) % mod;
cnt = cnt * inv2 % mod;
ll s = sum_i * cnt % mod;
add(ans, s);
cur = id + 1;
}
cout<<ans;
re;
}
I3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk9mYXN0LHVucm9sbC1sb29wcyIpCiNwcmFnbWEgR0NDIHRhcmdldCgiYXZ4Mix0dW5lPW5hdGl2ZSIpCgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgZmYoaSwgYSwgYikgZm9yKGF1dG8gaT0oYSk7IGk8PShiKTsgKytpKQojZGVmaW5lIGZmcihpLCBiLCBhKSBmb3IoYXV0byBpPShiKTsgaT49KGEpOyAtLWkpCiNkZWZpbmUgbmwgIlxuIgojZGVmaW5lIHNzICIgIgojZGVmaW5lIG1wIG1ha2VfcGFpcgojZGVmaW5lIHBiIGVtcGxhY2VfYmFjawojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgc3oocykgKGludClzLnNpemUoKQojZGVmaW5lIGFsbChzKSAocykuYmVnaW4oKSwgKHMpLmVuZCgpCiNkZWZpbmUgbXMoYSx4KSBtZW1zZXQoYSwgeCwgc2l6ZW9mIChhKSkKI2RlZmluZSBjbiBjb250aW51ZQojZGVmaW5lIHJlIGV4aXQoMCkKCnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1bGw7CnR5cGVkZWYgbG9uZyBkb3VibGUgbGQ7CnR5cGVkZWYgdmVjdG9yPGludD4gdmk7CnR5cGVkZWYgdmVjdG9yPGxsPiB2bGw7CnR5cGVkZWYgcGFpcjxpbnQsIGludD4gcGlpOwp0eXBlZGVmIHBhaXI8bGwsIGxsPiBwbGw7CnR5cGVkZWYgdmVjdG9yPHBpaT4gdnBpaTsKdHlwZWRlZiB2ZWN0b3I8cGxsPiB2cGxsOwoKY29uc3QgaW50IG1vZD0xZTkrNzsKY29uc3QgaW50IG1vZDI9OTk4MjQ0MzUzOwpjb25zdCBpbnQgbWF4bj0xZTUrMTA1Owpjb25zdCBpbnQgbWF4bT00Km1heG4rNTsKY29uc3QgbGwgaW5mPTFlMTY7Cgp2b2lkIHJmKCl7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7IGNvdXQudGllKG51bGxwdHIpOwogICAgaWYoZm9wZW4oIm8uaW4iLCJyIikpewogICAgICAgIGZyZW9wZW4oIm8uaW4iLCJyIixzdGRpbik7CiAgICAgICAgZnJlb3Blbigiby5vdXQiLCJ3IixzdGRvdXQpOwogICAgfQp9CgptdDE5OTM3XzY0IHJuZyhjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpLmNvdW50KCkpOwpsbCByYW4obGwgbCwgbGwgcikKewogICAgcmV0dXJuIHVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxsbD4gKGwsIHIpKHJuZyk7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIGFkZChUICZ4LCBjb25zdCBUICZ5KQp7CiAgICB4Kz15OwogICAgaWYoeD49bW9kKSB4LT1tb2Q7CiAgICBpZih4PDApIHgrPW1vZDsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGJvb2wgbWF4aShUICZhLCBUIGIpCnsKICAgIGlmKGE+PWIpIHJldHVybiAwOwogICAgYT1iOyByZXR1cm4gMTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGJvb2wgbWluaShUICZhLCBUIGIpCnsKICAgIGlmKGE8PWIpIHJldHVybiAwOwogICAgYT1iOyByZXR1cm4gMTsKfQoKc2lnbmVkIG1haW4oKQp7CiAgICByZigpOwogICAgbGwgbjsgY2luPj5uOwogICAgbGwgYW5zPTA7CiAgICBsbCBjdXI9MTsKICAgIGxsIGludjIgPSA1MDAwMDAwMDQ7IAogICAgd2hpbGUoY3VyPD1uKQogICAgewogICAgICAgIGxsIGlkID0gbiAvIChuIC8gY3VyKTsKICAgICAgICAKICAgICAgICBsbCBzdW1faSA9ICgoaWQgKyBjdXIpICUgbW9kKSAqICgoaWQgLSBjdXIgKyAxKSAlIG1vZCkgJSBtb2Q7CiAgICAgICAgc3VtX2kgPSBzdW1faSAqIGludjIgJSBtb2Q7CiAgICAgICAgCiAgICAgICAgbGwgY250ID0gbiAvIGN1cjsgCiAgICAgICAgY250ID0gKGNudCAlIG1vZCkgKiAoKGNudCArIDEpICUgbW9kKSAlIG1vZDsKICAgICAgICBjbnQgPSBjbnQgKiBpbnYyICUgbW9kOwogICAgICAgIAogICAgICAgIGxsIHMgPSBzdW1faSAqIGNudCAlIG1vZDsKICAgICAgICBhZGQoYW5zLCBzKTsKICAgICAgICAKICAgICAgICBjdXIgPSBpZCArIDE7CiAgICB9CiAgICBjb3V0PDxhbnM7CiAgICByZTsKfQ==
I3ByYWdtYSBHQ0Mgb3B0aW1pemUoJnF1b3Q7T2Zhc3QsdW5yb2xsLWxvb3BzJnF1b3Q7KQojcHJhZ21hIEdDQyB0YXJnZXQoJnF1b3Q7YXZ4Mix0dW5lPW5hdGl2ZSZxdW90OykKCiNpbmNsdWRlICZsdDtiaXRzL3N0ZGMrKy5oJmd0Owp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBmZihpLCBhLCBiKSBmb3IoYXV0byBpPShhKTsgaSZsdDs9KGIpOyArK2kpCiNkZWZpbmUgZmZyKGksIGIsIGEpIGZvcihhdXRvIGk9KGIpOyBpJmd0Oz0oYSk7IC0taSkKI2RlZmluZSBubCAmcXVvdDtcbiZxdW90OwojZGVmaW5lIHNzICZxdW90OyAmcXVvdDsKI2RlZmluZSBtcCBtYWtlX3BhaXIKI2RlZmluZSBwYiBlbXBsYWNlX2JhY2sKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIHN6KHMpIChpbnQpcy5zaXplKCkKI2RlZmluZSBhbGwocykgKHMpLmJlZ2luKCksIChzKS5lbmQoKQojZGVmaW5lIG1zKGEseCkgbWVtc2V0KGEsIHgsIHNpemVvZiAoYSkpCiNkZWZpbmUgY24gY29udGludWUKI2RlZmluZSByZSBleGl0KDApCgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWxsOwp0eXBlZGVmIGxvbmcgZG91YmxlIGxkOwp0eXBlZGVmIHZlY3RvciZsdDtpbnQmZ3Q7IHZpOwp0eXBlZGVmIHZlY3RvciZsdDtsbCZndDsgdmxsOwp0eXBlZGVmIHBhaXImbHQ7aW50LCBpbnQmZ3Q7IHBpaTsKdHlwZWRlZiBwYWlyJmx0O2xsLCBsbCZndDsgcGxsOwp0eXBlZGVmIHZlY3RvciZsdDtwaWkmZ3Q7IHZwaWk7CnR5cGVkZWYgdmVjdG9yJmx0O3BsbCZndDsgdnBsbDsKCmNvbnN0IGludCBtb2Q9MWU5Kzc7CmNvbnN0IGludCBtb2QyPTk5ODI0NDM1MzsKY29uc3QgaW50IG1heG49MWU1KzEwNTsKY29uc3QgaW50IG1heG09NCptYXhuKzU7CmNvbnN0IGxsIGluZj0xZTE2OwoKdm9pZCByZigpewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOyBjb3V0LnRpZShudWxscHRyKTsKICAgIGlmKGZvcGVuKCZxdW90O28uaW4mcXVvdDssJnF1b3Q7ciZxdW90OykpewogICAgICAgIGZyZW9wZW4oJnF1b3Q7by5pbiZxdW90OywmcXVvdDtyJnF1b3Q7LHN0ZGluKTsKICAgICAgICBmcmVvcGVuKCZxdW90O28ub3V0JnF1b3Q7LCZxdW90O3cmcXVvdDssc3Rkb3V0KTsKICAgIH0KfQoKbXQxOTkzN182NCBybmcoY2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKS5jb3VudCgpKTsKbGwgcmFuKGxsIGwsIGxsIHIpCnsKICAgIHJldHVybiB1bmlmb3JtX2ludF9kaXN0cmlidXRpb24mbHQ7bGwmZ3Q7IChsLCByKShybmcpOwp9Cgp0ZW1wbGF0ZSAmbHQ7dHlwZW5hbWUgVCZndDsgdm9pZCBhZGQoVCAmYW1wO3gsIGNvbnN0IFQgJmFtcDt5KQp7CiAgICB4Kz15OwogICAgaWYoeCZndDs9bW9kKSB4LT1tb2Q7CiAgICBpZih4Jmx0OzApIHgrPW1vZDsKfQoKdGVtcGxhdGUgJmx0O3R5cGVuYW1lIFQmZ3Q7IGJvb2wgbWF4aShUICZhbXA7YSwgVCBiKQp7CiAgICBpZihhJmd0Oz1iKSByZXR1cm4gMDsKICAgIGE9YjsgcmV0dXJuIDE7Cn0KCnRlbXBsYXRlICZsdDt0eXBlbmFtZSBUJmd0OyBib29sIG1pbmkoVCAmYW1wO2EsIFQgYikKewogICAgaWYoYSZsdDs9YikgcmV0dXJuIDA7CiAgICBhPWI7IHJldHVybiAxOwp9CgpzaWduZWQgbWFpbigpCnsKICAgIHJmKCk7CiAgICBsbCBuOyBjaW4mZ3Q7Jmd0O247CiAgICBsbCBhbnM9MDsKICAgIGxsIGN1cj0xOwogICAgbGwgaW52MiA9IDUwMDAwMDAwNDsgCiAgICB3aGlsZShjdXImbHQ7PW4pCiAgICB7CiAgICAgICAgbGwgaWQgPSBuIC8gKG4gLyBjdXIpOwogICAgICAgIAogICAgICAgIGxsIHN1bV9pID0gKChpZCArIGN1cikgJSBtb2QpICogKChpZCAtIGN1ciArIDEpICUgbW9kKSAlIG1vZDsKICAgICAgICBzdW1faSA9IHN1bV9pICogaW52MiAlIG1vZDsKICAgICAgICAKICAgICAgICBsbCBjbnQgPSBuIC8gY3VyOyAKICAgICAgICBjbnQgPSAoY250ICUgbW9kKSAqICgoY250ICsgMSkgJSBtb2QpICUgbW9kOwogICAgICAgIGNudCA9IGNudCAqIGludjIgJSBtb2Q7CiAgICAgICAgCiAgICAgICAgbGwgcyA9IHN1bV9pICogY250ICUgbW9kOwogICAgICAgIGFkZChhbnMsIHMpOwogICAgICAgIAogICAgICAgIGN1ciA9IGlkICsgMTsKICAgIH0KICAgIGNvdXQmbHQ7Jmx0O2FuczsKICAgIHJlOwp9
#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target("avx2,tune=native")
#include <bits/stdc++.h>
using namespace std;
#define ff(i, a, b) for(auto i=(a); i<=(b); ++i)
#define ffr(i, b, a) for(auto i=(b); i>=(a); --i)
#define nl "\n"
#define ss " "
#define mp make_pair
#define pb emplace_back
#define fi first
#define se second
#define sz(s) (int)s.size()
#define all(s) (s).begin(), (s).end()
#define ms(a,x) memset(a, x, sizeof (a))
#define cn continue
#define re exit(0)
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<pii> vpii;
typedef vector<pll> vpll;
const int mod=1e9+7;
const int mod2=998244353;
const int maxn=1e5+105;
const int maxm=4*maxn+5;
const ll inf=1e16;
void rf(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
if(fopen("o.in","r")){
freopen("o.in","r",stdin);
freopen("o.out","w",stdout);
}
}
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll ran(ll l, ll r)
{
return uniform_int_distribution<ll> (l, r)(rng);
}
template <typename T> void add(T &x, const T &y)
{
x+=y;
if(x>=mod) x-=mod;
if(x<0) x+=mod;
}
template <typename T> bool maxi(T &a, T b)
{
if(a>=b) return 0;
a=b; return 1;
}
template <typename T> bool mini(T &a, T b)
{
if(a<=b) return 0;
a=b; return 1;
}
signed main()
{
rf();
ll n; cin>>n;
ll ans=0;
ll cur=1;
ll inv2 = 500000004;
while(cur<=n)
{
ll id = n / (n / cur);
ll sum_i = ((id + cur) % mod) * ((id - cur + 1) % mod) % mod;
sum_i = sum_i * inv2 % mod;
ll cnt = n / cur;
cnt = (cnt % mod) * ((cnt + 1) % mod) % mod;
cnt = cnt * inv2 % mod;
ll s = sum_i * cnt % mod;
add(ans, s);
cur = id + 1;
}
cout<<ans;
re;
}