// Original C++ solution (slower):
#pragma region Template

#include <bits/stdc++.h>

using namespace std;

struct ios_accelerate { ios_accelerate() { ios::sync_with_stdio(false); cin.tie(nullptr); } } CALL;



#define REP(i, n) for(int i = 0; i < n; i++)

#define RNG(i, a, b) for(int i = a; i < b; i++)

#define RBF(i, v) for(auto& i : v)

#define ALL(x) x.begin(), x.end()



using LL = long long;

using UL = unsigned long;

using ULL = unsigned long long;

template<typename T> using V = vector<T>;

template<typename T> using VV = vector<vector<T>>;

template<typename T> using P = pair<T, T>;

template<typename T> using VP = vector<pair<T, T>>;



const double PI = 3.141592653589793;

const int MOD = 1000000007;

const LL INF64 = static_cast<LL>(1e18) + 2;

const int INF = static_cast<int>(1e9) + 2;



template<typename T> inline void upsort(vector<T>& x) { sort(x.begin(), x.end()); }

template<typename T> inline void downsort(vector<T>& x) { sort(x.begin(), x.end(), greater<T>()); }

template<typename T> inline void col(T x) { cout << x << '\n'; }

template<> inline void col(double x) { cout << fixed << setprecision(12) << x << '\n'; }

#pragma endregion



std::vector<LL> yaku_num;

template<typename T> void segment_sieve(T num) {

	yaku_num = std::vector<T>(num, 2);

	yaku_num[1] = 1;

	T lim = ceil(sqrt(num));

	std::vector<bool> is_prime_small(num, true);

	std::vector<int> vec(num, 0);

	V<bool> flg(num, true);



	for (T i = 2; i < lim; i++) {

		if (is_prime_small[i]) {

			for (T j = i * i; j < num; j += i) {

				is_prime_small[j] = false;

				if (vec[j] == 0) vec[j] = j;

				LL yaku = 1;

				while (vec[j] % i == 0) {

					yaku++;

					vec[j] /= i;

				}

				yaku_num[j] *= yaku;

				if (vec[j] == 1 && flg[j]) {

					yaku_num[j] /= 2;

				}

			}

		}

	}

}





signed main() {

	LL n;

	cin >> n;



	segment_sieve(n+1);



	LL k = 1, ans = 0;

	while (k <= n) {

		ans += k * yaku_num[k];

		k++;

	}

	

	col(ans);

	return 0;

}


// Optimized solution to the same problem (faster):
#pragma region Template

#include <bits/stdc++.h>

using namespace std;

struct ios_accelerate { ios_accelerate() { ios::sync_with_stdio(false); cin.tie(nullptr); } } CALL;



#define REP(i, n) for(int i = 0; i < n; i++)

#define RNG(i, a, b) for(int i = a; i < b; i++)

#define RBF(i, v) for(auto& i : v)

#define ALL(x) x.begin(), x.end()



using LL = long long;

using UL = unsigned long;

using ULL = unsigned long long;

template<typename T> using V = vector<T>;

template<typename T> using VV = vector<vector<T>>;

template<typename T> using P = pair<T, T>;

template<typename T> using VP = vector<pair<T, T>>;



const double PI = 3.141592653589793;

const int MOD = 1000000007;

const LL INF64 = static_cast<LL>(1e18) + 2;

const int INF = static_cast<int>(1e9) + 2;



template<typename T> inline void upsort(vector<T>& x) { sort(x.begin(), x.end()); }

template<typename T> inline void downsort(vector<T>& x) { sort(x.begin(), x.end(), greater<T>()); }

template<typename T> inline void col(T x) { cout << x << '\n'; }

template<> inline void col(double x) { cout << fixed << setprecision(12) << x << '\n'; }

#pragma endregion





LL tosa(LL x, LL n) {

	LL y = n / x;

	return x * y * (y + 1) / 2;

}



signed main() {

	LL n;

	cin >> n;



	LL k = 1, ans = 0;

	while (k <= n) {

		ans += tosa(k, n);

		k++;

	}

	

	col(ans);

	return 0;

}


// Fastest known solution for this problem: