#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<vector<int>> vvi;
typedef vector<ll> vll;
typedef vector<vector<ll>> vvll;

#define REP(k, n) for (ll k = 0; k < (ll)(n); ++k)
#define REPREV(k, n) for (ll k = (ll)(n)-1; k >= 0; --k)
#define FOR(k, a, b) for (ll k = (ll)(a); k < (ll)(b); ++k)
#define FORREV(k, a, b) for (ll k = (ll)(b)-1; k >= (ll)(a); --k)
#define FOREACH(e, v) for (auto& e : v)

#define TGET(t, i) get<i>(t)
#define TSET(t, i, a) get<i>(t) = a
// MinHeap - priority_queue<ll, vll, greater<ll>> pq;

#define EVEN(n) ((n)&1) == 0
#define ODD(n) ((n)&1) == 1

#define SORT(v) sort(v.begin(), v.end())
#define SORTREV(v) sort(v.rbegin(), v.rend())
#define SHUFFLE(v) random_shuffle(v.begin(), v.end())
//srand(unsigned(time(0)));

#define REMOVEAT(v, i) v.erase(v.begin() + i)
#define REVERSE(v) reverse(v.begin(), v.end())

ll MOD(ll x, ll m) {
    ll r = x % m;
    if (r < 0) {
        r += m;
    }
    return r;
}

ostream& operator<<(ostream& str, const pll& p) {
    str << p.first << " " << p.second;
    return str;
}

template <typename T>
void join(T& arr, string sep) {
    bool first = true;
    for (auto t : arr) {
        if (first) {
            first = false;
            cout << t;
        } else {
            cout << sep << t;
        }
    }
    cout << "\n";
}

#define POS "POSSIBLE"
#define IMPOS "IMPOSSIBLE"

// #define INF LLONG_MAX
// #define MINF LLONG_MIN
#define INF 9e18
#define MINF -INF

// const ll maxn = (ll)1e7;
vll spf;
vll primes;
void sieve(ll limit, bool computePrimes = false) {
    spf.resize(limit + 1);
    spf[1] = 1;
    for (ll i = 3; i < spf.size(); i += 2)
        spf[i] = i;

    for (ll i = 2; i < spf.size(); i += 2)
        spf[i] = 2;

    for (ll i = 3; i * i < spf.size(); i++) {
        if (spf[i] == i) {
            for (ll j = i * i; j < spf.size(); j += i)
                if (spf[j] == j)
                    spf[j] = i;
        }
    }

    if (computePrimes) {
        primes.push_back(2);
        for (ll i = 3; i <= limit; i += 2) {
            if (spf[i] == i)
                primes.push_back(i);
        }
    }
}
vll getPrimeFactorization(ll x, bool unique = false) {
    vll ret;
    while (x != 1) {
        if (!unique || ret.empty() || ret.back() != spf[x])
            ret.push_back(spf[x]);
        x = x / spf[x];
    }
    return ret;
}
vector<pll> getPrimeCount(ll x) {
    vector<pll> res;
    while (x != 1) {
        if (!res.empty() && res.back().first == spf[x]) {
            res.back().second++;
        } else {
            res.push_back({spf[x], 1});
        }
        x = x / spf[x];
    }
    return res;
}
ll countFactors(ll x) {
    ll ret = 1;
    ll prev = -1;
    ll curCount = 0;
    while (x != 1) {
        if (spf[x] != prev) {
            ret *= (curCount + 1);
            curCount = 1;
            prev = spf[x];
        } else {
            curCount++;
        }
        x = x / spf[x];
    }
    ret *= (curCount + 1);
    return ret;
}

void solve() {
    ll n;
    cin >> n;
    sieve(n);
    ll res = 0;
    FOR(i, 1, n+1) {
        res += i * countFactors(i);
    }


    // cout << fixed << setprecision(6);
    cout << res << "\n";
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    int tt = 1;
    
    // cin >> tt;
    for (int t = 1; t <= tt; t++) {
        // cout << "Case #" << t << ": ";
        solve();
    }

    return 0;
}

Measured memory_bytes: 81340