Problem
Calculate for primes .
Solution
First, simplify the sum modulo .
Thus, .
By Wilson’s Theorem, .
Expanding gives:
So, .
Now, let’s combine this and solve for :
You can compute in time using Fermat’s Little Theorem () or precomputed values based on .
#include <iostream>
#include <vector>
std::vector<int> generate_primes(int n) {
std::vector<bool> is_prime(n + 1, true);
for (int i = 2; i * i <= n; ++i) {
if (is_prime[i]) {
for (int j = i * i; j <= n; j += i) {
is_prime[j] = false;
}
}
}
std::vector<int> primes;
for (int i = 2; i <= n; ++i) {
if (is_prime[i]) {
primes.push_back(i);
}
}
return primes;
}
long long s(long long p) {
long long rem = p % 8;
if (rem == 1) return (-3 + 3 * p) / 8;
if (rem == 3) return (-3 + p) / 8;
if (rem == 5) return (-3 + 7 * p) / 8;
return (-3 + 5 * p) / 8;
}
int main(void) {
std::vector<int> primes = generate_primes(100000000);
long long ans = 0;
for (int p : primes) {
if (p < 5) continue;
ans += s(p);
}
std::cout << ans << std::endl;
return 0;
}