public class Euler10 {
    static long solve(int limit) {
        if (limit <= 2)
            return 0;
        boolean[] isPrime = new boolean[limit];
        java.util.Arrays.fill(isPrime, true);
        isPrime[0] = isPrime[1] = false;
        for (int p = 2; (long) p * p < limit; p++) {
            if (!isPrime[p])
                continue;
            for (int q = p * p; q < limit; q += p) {
                isPrime[q] = false;
            }
        }
        long sum = 0;
        for (int p = 2; p < limit; p++) {
            if (isPrime[p])
                sum += p;
        }
        return sum;
    }

    public static void main(String[] args) {
        assert solve(10) == 17 : "Checkpoint failed for limit=10";
        System.out.println(solve(2000000));
    }
}
