#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize ("-O3")
#define ll long long  int
// #include <boost/multiprecision/cpp_int.hpp>
// using boost::multiprecision::cpp_int;
// cpp_int x;
// namespace mp=boost::multiprecision;
// mp::cpp_int s=n;
#define all(x) (x).begin(), (x).end()
using ld = long double;
const ll mod = 1000000007;
const ll inf = 1000000000000000000;
const ll rk = 256;
const ld PI = 3.141592653589793;
#define pb push_back
#define mp make_pair
#define vc vector
#define fs first
#define sec second
// #define pq priority_queue
#define lb lower_bound
#define ub upper_bound
#define pll pair<ll,ll>
#define pls pair<ll,string>
#define psl pair<string,ll>
#define plc pair<ll,char>
#define pcl pair<char,ll>
#define pss pair<string,string>
#define all(x) (x).begin(), (x).end()
#define tol(s) transform(s.begin(),s.end(),s.begin(),::tolower);
#define tou(s) transform(s.begin(),s.end(),s.begin(),::toupper);
#define print(a) for(auto j:a) {cout<<j<<",";} cout << "\n";
#define endl '\n'
#define FastIO ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0)
// getting string line
// getline(cin,word);

// STL:
//        (1) PRIORITY_QUEUE pq:
//        -> priority_queue < int > pq; // max_heap
//        -> priority_queue < int , vector < int > , greater < int > > pq; // min_heap
//        -> pq.top()   --> returns the maximum or minimum element
//        -> pq.push()  --> push element into the queue
//        -> pq.pop()   --> remove top most element
//        -> pq.empty() --> checks whether queue is empty or not

//        (2) set / multiset  ss;
//        --> ss.insert(key); (insertion)
//        --> ss.erase(ss.find(key)) .. (deletion)
//        --> ss.find(key) != ss.end() ..existence check
//        --> ss.lower_bound(x) -> smallest value which is greater than or equals to x
//        --> ss.upper_bound(x) --> first value strictly greater than x
//        --> multiset< data_type , greater<data_type> > ms; // for max ordering

//        (3) common functions
//        lower_bound(v.begin(),v.end(),x) - v.begin() --> smallest value greater than or equals to x
//        upper_bound(v.begin(), v.end(),x)- v.begin() --> smallest value greater than x
//        memset(dp , val , sizeof(dp)) -> sets the value of array dp to val

//        (4)  common mistakes
//            .) long long vs int overflow
//            .) read question carefully please!!!! it can cost you a lot
//            .) unorderedmap is O(1) look up but worst case can be bad
//            .) maps have higher constant so many lookups can cause TLE
//            .) leaving debugs or cerrs in the program at times can cause TLE


ostream & operator << (ostream & os, pair <ll, ll> const& x) {
    os << x.first << "," << x.second;
    return os;
}

template <class T>
ostream & operator << (ostream & os, vector <T> const& x) {
    os << "{ ";
    for(auto& y : x) os << y << " ";
    return os << "}";
}

template <class T>
ostream & operator << (ostream & os, set <T> const& x) {
    os << "{ ";
    for(auto& y : x) os << y << " ";
    return os << "}";
}

template <class Ch, class Tr, class Container>
basic_ostream <Ch, Tr> & operator << (basic_ostream <Ch, Tr> & os, Container const& x) {
    os << "{ ";
    for(auto& y : x) os << y << " ";
    return os << "}";
}

template <class X, class Y>
ostream & operator << (ostream & os, pair <X, Y> const& p) {
    return os << "[ " << p.first << ", " << p.second << "]" ;
}

struct comp {
    bool operator()(int const &i, int const &j) const {
        return i > j;
    }
};

struct Triplet{
    ll x,y,z;
};

ll modularexpo(ll x,ll n){
    ll res = 1;
    while(n>0){
        if(n%2==1)
            res = (res*x);
        x = x*x;
        n = n/2;
    }
    return res;
}
const ll maxn = 1e7 + 5;

ll spf[maxn];
ll final[maxn];
vector<ll> ans;

void sieve(ll n){
    spf[1] = 1;
    for(ll i = 2; i < maxn; i++){
        if(spf[i]==0){
            spf[i] = i;
            ans.pb(i);
        }
        for(ll j = 0; j < ans.size() && i * 1LL * ans[j] < 1LL * maxn; j++){
            spf[i * ans[j]] = ans[j];
            if(i % ans[j] == 0)
                break;
        }
    }
    for(ll i = 1; i <= n; i++){
        ll temp = i;
        map<ll, ll> codechef;
        while(temp > 1){
            codechef[spf[temp]]++;
            temp /= spf[temp];
        }
        ll cnt = 1;
        for(auto x : codechef){
            cnt *= 1LL * (x.second + 1);
        }
        final[i] = cnt;
    }
}


int main(){
    FastIO;
#ifndef ONLINE_JUDGE
    // for getting input from input.txt
    freopen("input.txt", "r", stdin);
    // for writing output to output.txt
    freopen("output.txt", "w", stdout);
#endif
    FastIO;
    ll n;
    cin >> n;
    sieve(n);
    ll ans = 0;
    for(ll i=1;i<=n;i++)
        ans += i*1LL*final[i];
    cout<<ans;
    return 0;
}


Measured memory_bytes: 164916