/*
题意:给定一个N,求从2~N的最小公倍数的和
类型:数学
分析:两种姿势可以A题,但是用时相差很大
1.用类似埃氏筛选法,处理出前缀和4000+ms
2.用类似因式分解的方法,分成两部分,sqrt(N)前和后,后的可以用求和公式,前的
用n/i*i求出来20ms
*/
//第一种方法
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 20000001;
typedef long long ll;
ll ans[maxn];
int main()
{
for(int i=2;i<maxn;i++){
for(int j=i;j<maxn;j+=i){
ans[j]+=i;
}
ans[i]+=ans[i-1];
}
int n;
while(~scanf("%d",&n)){
printf("%lld\n",ans[n]+n-1);
}
return 0;
}
//第二种方法(队友刚开始吃TLE,一气之下写了个20ms的代码QAQ)
#include <iostream>
#include<cstdio>
using namespace std;
int main()
{
long long n;
while(scanf("%lld",&n)!=EOF){
if(n==0)break;
long long sum=0;
long long old=n;
long long i;
for(i=2ll;i*i<=n;i++){
long long old=n/(i-1);
long long neww=n/i;
sum+=(n/i)*i;
sum+=(i-1)*(old+neww+1)*(old-neww)/2;
}
i-=1ll;
if(n/i!=i){
sum+=(n/i)*i;
}
printf("%lld\n",sum+n-1);
}
return 0;
}