#include <iostream>
#include <iomanip>
#include <random>
#include <cmath>
using namespace std;
// Funkcja podcałkowa
long double f(long double x) {
return sqrt(1.0L - x * x);
}
int main() {
// Tu ustawiasz liczbę losowań / podziałów
const long long n = 1000000; // możesz zmienić np. na 10000000
cout << fixed << setprecision(20);
// =========================
// 1. METODA MONTE CARLO
// =========================
mt19937_64 gen(123456); // stałe ziarno dla powtarzalnych wyników
uniform_real_distribution<long double> dist(-1.0L, 1.0L);
long long inside = 0;
for (long long i = 0; i < n; i++) {
long double x = dist(gen);
long double y = dist(gen);
if (x * x + y * y <= 1.0L)
inside++;
}
long double pi_monte = 4.0L * inside / n;
// =========================
// 2. METODA PROSTOKĄTÓW (punkty środkowe)
// =========================
long double h = 1.0L / n;
long double sum_rect = 0.0L;
for (long long i = 0; i < n; i++) {
long double x = (i + 0.5L) * h;
sum_rect += f(x);
}
long double pi_rect = 4.0L * h * sum_rect;
// =========================
// 3. METODA TRAPEZÓW
// =========================
long double sum_trap = (f(0.0L) + f(1.0L)) / 2.0L;
for (long long i = 1; i < n; i++) {
long double x = i * h;
sum_trap += f(x);
}
long double pi_trap = 4.0L * h * sum_trap;
// =========================
// WYNIKI
// =========================
cout << "Przyblizenie liczby pi (n = " << n << "):\n\n";
cout << "Monte Carlo : " << pi_monte << endl;
cout << "Prostokaty : " << pi_rect << endl;
cout << "Trapezy : " << pi_trap << endl;
return 0;
}