Problem

Problem Link

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 .

CodeCPP fileDownload

#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;
}