#include <bits/stdc++.h>
using namespace std;
int main() {
srand(time(0));
int sizes[] = {1000, 10000, 100000};
for (int n : sizes) {
int in = 0;
for (int i = 0; i < n; i++) {
double x = (double)rand() / RAND_MAX;
double y = (double)rand() / RAND_MAX;
if (x*x + y*y <= 1.0) in++;
}
double pi = 4.0 * in / n;
cout << n << "\t" << in << "\t" << pi << endl;
}
return 0;
}
/*
Q1. How does the estimate change with larger N?
= As N increases, the estimate becomes more accurate and closer to π.
Q2. How close does it get to actual π?
= With N=1000, error ≈ ±0.1; N=10000, error ≈ ±0.03; N=100000, error ≈ ±0.01.
Larger N improves the approximation to 3.14159.
*/
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgbWFpbigpIHsKICAgIHNyYW5kKHRpbWUoMCkpOwoKICAgIGludCBzaXplc1tdID0gezEwMDAsIDEwMDAwLCAxMDAwMDB9OwoKICAgIGZvciAoaW50IG4gOiBzaXplcykgewogICAgICAgIGludCBpbiA9IDA7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgZG91YmxlIHggPSAoZG91YmxlKXJhbmQoKSAvIFJBTkRfTUFYOwogICAgICAgICAgICBkb3VibGUgeSA9IChkb3VibGUpcmFuZCgpIC8gUkFORF9NQVg7CiAgICAgICAgICAgIGlmICh4KnggKyB5KnkgPD0gMS4wKSBpbisrOwogICAgICAgIH0KICAgICAgICBkb3VibGUgcGkgPSA0LjAgKiBpbiAvIG47CiAgICAgICAgY291dCA8PCBuIDw8ICJcdCIgPDwgaW4gPDwgIlx0IiA8PCBwaSA8PCBlbmRsOwogICAgfQoKICAgIHJldHVybiAwOwp9CgovKgpRMS4gSG93IGRvZXMgdGhlIGVzdGltYXRlIGNoYW5nZSB3aXRoIGxhcmdlciBOPwo9IEFzIE4gaW5jcmVhc2VzLCB0aGUgZXN0aW1hdGUgYmVjb21lcyBtb3JlIGFjY3VyYXRlIGFuZCBjbG9zZXIgdG8gz4AuCgpRMi4gSG93IGNsb3NlIGRvZXMgaXQgZ2V0IHRvIGFjdHVhbCDPgD8KPSBXaXRoIE49MTAwMCwgZXJyb3Ig4omIIMKxMC4xOyBOPTEwMDAwLCBlcnJvciDiiYggwrEwLjAzOyBOPTEwMDAwMCwgZXJyb3Ig4omIIMKxMC4wMS4gCkxhcmdlciBOIGltcHJvdmVzIHRoZSBhcHByb3hpbWF0aW9uIHRvIDMuMTQxNTkuCiovCg==