#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = (a); i < (b); i++)
using ll = long long;
using ull = unsigned long long;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<ull> vul;
typedef vector<int> vi;
typedef vector<string> vs;
typedef vector<vector<ll>> vvl;
typedef vector<vector<string>> vvs;
typedef vector<vector<ull>> vvul;
typedef vector<bool> vb;
const ll md = 1000000007;

ll add(ll a, ll b, ll mod = md) {
    return (a%mod + b%mod + mod)%mod;
}

ll mul(ll a, ll b, ll mod = md) {
    return ((a%mod) * (b%mod))%mod;
}

ll fn(ll st, ll d, ll tm, ll mod = md) {
    ll res = 1, x = d%mod;
    ll ans = 0;
    while(tm) {
        if(tm&1) ans = (x*ans + res)%mod;
        res = ((res*x)%mod + res%mod)%mod;
        x = (x*x)%mod;
        tm = tm/2;
    }
    ans = (ans*st)%mod;
    return ans;
}

ll C(vl &fact, vl &invfact, ll n, ll r, ll mod = md) {
    if(r == 0) return 1;
    return mul(fact[n], mul(invfact[r], invfact[n-r], mod), mod);
}

ll mulm(ll a, ll b, ll mod = md) {
    ll r = 0;
    a %= mod;
    while (b) {
        if (b & 1) r = (r+a)%mod;
        a = (a+a)%mod;
        b = (b >> 1);
    }
    r %= mod;
    return r;
}

ll power(ll x, ll n, ll mod = md) {
    ll res = 1;
    x %= mod;
    while (n) {
        if (n & 1)  res = (res*x)%mod;
        n = (n >> 1);
        x = (x*x)%mod;
    }
    res %= mod;
    return res;
}

ll power2(ll x, ll n) {
    ll res = 1;
    while (n) {  
        if (n & 1) res = (res*x);
        n = (n >> 1);
        x = (x*x);
    }  
    return res;
}

bool is_prime(ll x) {
    if(x == 1 || x == 0) return false;
    for(int i=2; i*i <= x; i++) {
        if(x%i == 0) return false;
    }
    return true;
}

ll Phi(ll n, vector<ll> const &primes) { 
    ll res = n; 
    for (ll i=0; primes[i]*primes[i] <= n; i++) {
        if (n % primes[i]== 0) { 
            res -= (res / primes[i]); 
            while (n%primes[i]== 0) {
               n/=primes[i]; 
            }
        } 
    } 
    if (n > 1) {
       res -= (res / n); 
    }
    return res; 
}

void sieve(vector<ll> &primes, ll lim) {
	vector<bool> prime(lim+1, true);
    for(int i = 2; i*i <= lim; i++) {
        if(prime[i]) {
            for(int j = 2; j*i <= lim; j++) {
                prime[j*i] = false;
            }
        }
    }
    primes.push_back(2);
    for(int i = 3; i <= lim; i+=2) {
        if(prime[i]) {
            primes.push_back(i);
        }
    }
}

void sieveGCD(ll lim, vector<ll> &tab, vector<ll> const &primes) {
    for(int  i = 1; i <= lim; i++) {
        tab[i] = i;
    }
    for(int i = 0; i < primes.size() && primes[i] <= lim; i++) {
        tab[primes[i]] = primes[i]-1;
        for(int j = 2; primes[i]*j <= lim; j++) {
            tab[primes[i]*j] = (tab[primes[i]*j]/primes[i])*(primes[i]-1);
        }
    }
}

ll LC(vl &fac, vl &ifac, ll n, ll r, ll p = md) {
	if(r > n || r < 0) {
		return 0;
	}
	if(r == 0 || r == n) {
		return 1;
	}
	if (n >= p) {
		return mul(LC(fac, ifac, n/p, r/p, p), LC(fac, ifac, n%p, r%p, p), p);
	}
	return mul(fac[n], mul(ifac[r], ifac[n-r], p), p);
}

void cachefact(vector<ll>& fac, vector<ll> &ifac, ll bound, ll mod = md) {
	fac[0] = 1;
	ifac[0] = power(1, mod-2)%mod;
	for(ll i = 1; i <= bound; i++) {
		fac[i] = (fac[i-1] % mod * i % mod)%mod;
		ifac[i] = power(fac[i], mod-2)%mod;
	}
}

void multiply(vvl &F, vvl &R, ll N) {
	vvl temp(N, vl (N, 0));
	for(int i = 0; i < N; i++) {
		for(int j = 0; j < N; j++) {
			for(int k = 0; k < N; k++) {
				temp[i][j] = add(temp[i][j], mul(F[i][k], R[k][j]));
			}
		}
	}
	F = temp;
}

void mpow(vvl &F, ll N, ll n) {
	vvl R(N, vl (N, 0));
	for(int i = 0; i < N; i++) R[i][i] = 1;
	while(n) {
		if(n&1) multiply(R, F, N);
		multiply(F, F, N);
		n = (n >> 1);
	}
	F = R;
}

ll lg(ll b, ll e) {
	ll i, x = b;
	for(i = 0; ; i++, x *= b) {
		if(x > e) {
			break;
		}
	}
	return i;
}

void make_set(int num, map<ll,ll> &par) {
	par[num] = num;
}
int find_set(int a, map<ll,ll> &par) {
	if(par[a] == a) {
		return a;
	}
	return par[a] = find_set(par[a], par);
}

void union_set(int a, int b, map<ll,ll> &par, map<ll,ll> &sz) {
	a = find_set(a, par);
	b = find_set(b, par);
	if(a == b) {
		return;
	}
	if(sz[a] < sz[b]) {
		a = b;
	}
	par[b] = a;
	sz[a] = sz[a] + sz[b];
}

// void rec(int pos, ll mask, int sign) {
// 	if(pos == n) {
// 		res = add(res, (sign == 1 ? 1 : -1)*mul(power(mask, k), sum(fac, ifac, m/mask, k)));
// 		if(mul(power(mask, k), sum(fac, ifac, m/mask, k)) < 0) {
// 			cout << mul(power(mask, k), sum(fac, ifac, m/mask, k)) << "\n";
// 		}
// 		return;
// 	}
// 	ll tmp = 1, si = 1;
// 	for(int i = 0; i <= 1; i++) {
// 		if(mask <= m/tmp) {
// 			rec(pos + 1, mask * tmp, sign * si);
// 			si = -si;
// 			tmp = tmp * a[pos];
// 		}
// 	}
// }

void cachesum(vl& o, vvl& s) {
    o[1]=1;
    int i, j;
    for(i=2;i<=12;i++) {
        o[i]=(md-md/i)*o[md%i]%md;
    }
    s[0][1]=1;
    for(i=1;i<=12;i++)
    {
        s[i][1]=1;
        for(j=2;j<=i+1;j++)
        {
            s[i][j]=s[i-1][j-1]*i%md*o[j]%md;
            s[i][1]=(s[i][1]+md-s[i][j])%md;
        }
    }
}

ll sum(vvl& s, ll r, ll k1, ll mod = md)
{
    r %= mod;
    ll ret = 0;
    for(int i = k1+1; i > 0; i--) {
        ret = (ret + s[k1][i])*r%md;
    }
    return ret;
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	ll n, sum = 0;
	cin >> n;
	for(ll i = 1; i <= n; i++) {
		ll up = n / i;
		sum += (i * up * (up + 1))/2;
	}
	cout << sum << "\n";
	return 0;
}

Measured memory_bytes: 3636