#include <stdio.h>
#include <stdlib.h>
#include <omp.h>

int main(int argc, char *argv[]) {
    int thread_count = 4;
    long long n = 100000000;
    if (argc > 1) {
        thread_count = (int)strtol(argv[1], NULL, 10);
    }
    if (argc > 2) {
        n = strtoll(argv[2], NULL, 10);
    }

    double factor;
    double sum = 0.0;

    double start = omp_get_wtime();
#   pragma omp parallel for num_threads(thread_count) \
        default(none) reduction(+: sum) private(factor) shared(n)
    for (long long k = 0; k < n; k++) {
        factor = (k % 2 == 0) ? 1.0 : -1.0;
        sum += factor / (2 * k + 1);
    }
    double elapsed = omp_get_wtime() - start;

    double pi_approx = 4.0 * sum;
    printf("Terms: %lld\n", n);
    printf("Threads: %d\n", thread_count);
    printf("Estimate of pi: %.14f\n", pi_approx);
    printf("Actual pi:      %.14f\n", 3.14159265358979);
    printf("Elapsed time: %.3f seconds\n", elapsed);
    return 0;
}
