### BUGGY CODE ###

## めちゃめちゃ時間かかってて詰んだ

###==================================================
### import
import bisect
#from collections import Counter, deque, defaultdict
from copy import deepcopy
#from functools import reduce, lru_cache
#from heapq import heappush, heappop
#import itertools
#import math
#import string
import sys
### stdin
def input(): return sys.stdin.readline()
def iIn(): return int(input())
def iInM(): return map(int, input().split())
def iInM1(): return map(int1, input().split())
def iInLH(): return list(map(int, input().split()))
def iInLH1(): return list(map(int1, input().split()))
def iInLV(n): return [iIn() for _ in range(n)]
def iInLV1(n): return [iIn()-1 for _ in range(n)]
def iInLD(n): return [iInLH() for _ in range(n)]
def iInLD1(n): return [iInLH1() for _ in range(n)]
def sInLH(): return list(input().split())
def sInLV(n): return [input().rstrip("\n") for _ in range(n)]
def sInLD(n): return [sInLH() for _ in range(n)]
### stdout
def OutH(lst): print(*lst)
def OutV(lst): print(*lst, sep="\n")
### setting
sys.setrecursionlimit(10 ** 6)
### utils
int1 = lambda x: int(x) - 1
### constants
INF = int(1e9)
MOD = 1000000007
dx = (-1, 0, 1, 0)
dy = (0, -1, 0, 1)
###---------------------------------------------------


N = iIn()

lst_n_div = [0, 1, 2] ## 0, 1, 2
primes = [2]
lst_div = [[[2],[1]]] ## 2
for n in range(3, N+1):
    for p in primes: ## 合成数
        if n % p == 0:
            dived = deepcopy(lst_div[n // p - 2])
            idx = bisect.bisect_left(dived[0], p)
            #print('dived', dived, 'idx', idx)
            if dived[0][idx] == p: ## 同じ素数で割っている
                dived[1][idx] += 1
                lst_div.append(dived)
            else:
                dived[0].insert(idx, p)
                dived[1].insert(idx, 1)
                lst_div.append(dived)
            break
    else: ## 素数
        lst_div.append([[n],[1]])
        primes.append(n)
    #print(primes)
    #print(n, lst_n_div, lst_div)
    n_div = 1
    for i in range(len(lst_div[-1][1])):
        n_div *= (lst_div[-1][1][i] + 1)
    lst_n_div.append(n_div)

ans = 0
for n in range(1, N+1):
    ans += (n * lst_n_div[n])

#print(lst_div)
#print(lst_n_div)
print(ans)
    


### FIXED CODE ###

###==================================================
### import
#import bisect
#from collections import Counter, deque, defaultdict
#from copy import deepcopy
#from functools import reduce, lru_cache
#from heapq import heappush, heappop
#import itertools
#import math
#import string
import sys
### stdin
def input(): return sys.stdin.readline()
def iIn(): return int(input())
def iInM(): return map(int, input().split())
def iInM1(): return map(int1, input().split())
def iInLH(): return list(map(int, input().split()))
def iInLH1(): return list(map(int1, input().split()))
def iInLV(n): return [iIn() for _ in range(n)]
def iInLV1(n): return [iIn()-1 for _ in range(n)]
def iInLD(n): return [iInLH() for _ in range(n)]
def iInLD1(n): return [iInLH1() for _ in range(n)]
def sInLH(): return list(input().split())
def sInLV(n): return [input().rstrip("\n") for _ in range(n)]
def sInLD(n): return [sInLH() for _ in range(n)]
### stdout
def OutH(lst): print(*lst)
def OutV(lst): print(*lst, sep="\n")
### setting
sys.setrecursionlimit(10 ** 6)
### utils
int1 = lambda x: int(x) - 1
### constants
INF = int(1e9)
MOD = 1000000007
dx = (-1, 0, 1, 0)
dy = (0, -1, 0, 1)
###---------------------------------------------------

N = iIn()

ans = 0
for k in range(1, N+1):
    ans += k * (N // k) * (N // k + 1) // 2

print(ans)