How do I find the sum of all primes below 10^12?
I use sieve of Eratosthenes with O(n * log(log(n)))
but I want an algorithm to calculate this faster.
My code runs in 4 sec for 10^8, but it takes many hours to calculate 10^12.
This is my code:
#include <iostream>
#include <vector>
#include <algorithm>
#define big long long int
#define ubig unsigned long long
#define SZ(x) int(x.size())
#define Pb push_back
using namespace std;
const big maxn = 1000 * 1000 + 10;
const big mod = 100000000;
const big Delta = 100000000;
bool s[mod], p[maxn];
big b[maxn];
vector <big> primes;
ubig ans = 0, n;
void init_primes () {
for (big i = 2; i <= 1000 * 1000; i++) {
if (p[i]) continue;
primes.Pb(i);
b[SZ(primes)-1] = primes.back() * primes.back();
for (big j = i * i; j <= 1000 * 1000; j += i) {
p[j] = 1;
}
}
}
void sieve (big from, big to) {
cerr << to / mod << " of " << n / mod << "\n" ;
fill (s,s+mod,0);
for (big i = 0; i < SZ(primes) && primes[i] <= to; i++) {
big j = b[i];
for (; j <= to; j += primes[i]) {
s[j%mod] = 1;
}
if (j >= b[i]) {
b[i] = j;
}
}
for (big k = 0; k < mod; k++) {
if (s[k] == 0) {
ans += from + k;
// ans %= Delta;
}
}
}
int main () {
init_primes();
n = 1000ll * 1000 * 1000 * 1000;
// cin >> n;
for (big i = 0; i + mod <= n; i += mod) {
sieve (i,i+mod);
}
cout << ans-1 << endl;
}
The overflow from long long not matter now!