#include <iostream>
#include <vector>
using namespace std;
using ll = long long;

const ll N = 3e7; // 质数筛选最大范围
vector<ll> primes;         // 存储筛出的所有质数
vector<bool> is_prime(N + 1, true); // 标记是否为质数,初始默认是质数


int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

    ll n;
    cin >> n;



    ll sum = 0; // 总和必须用long long,避免int溢出

    is_prime[0] = is_prime[1] = false; // 0和1不是质数
    for (ll i = 2; i <= n; ++i) {   // 遍历2~MAXN所有数
        if (is_prime[i]) {
            primes.push_back(i);       // 未被标记则是质数,加入数组
            sum += i;
        }
        for (ll p : primes) {          // 用已筛质数标记合数
            if (i * p > n) break;   // 超出范围则终止
            sum += p;
            is_prime[i * p] = false;   // 标记i*p为合数
            if (i % p == 0) break;     // 本句为线性筛核心,保证仅被最小质因子标记
        }
    }

    cout << sum << '\n';
    return 0;
}