# Estimating $p_{13}−p_{13}$ https://neoj.sprout.tw/problem/1024/ $π$ 是一個神奇的數字,約等於 $3.14159$,但在許多工程師們的眼中 $π:=3$. ![](https://i.imgur.com/VV3BaTj.png) 這讓把 $π$ 當作幸運數字的派派覺得非常生氣。為了諷刺這種荒謬的行為,他決定透過計算各種 $π$ 近似值的差值之大來告訴眾工程師這樣的行為是非常不可取的。 而且對派派而言,$π$ 就是 $π$,$π$ 的近似值根本沒有資格被稱為 $π$,於是他給了他們另一個名字:$p_{13}$,所以他稱這次的計畫為 $p_{13}−p_{13}$ 計畫。 首先他把他的目標放在了下面的等式上 $$\fracπ2=\prod_{i=1}^\infty(\frac{2i}{2i−1}⋅\frac{2i}{2i+1})=(\frac21⋅\frac23)⋅(\frac43⋅\frac45)⋅(\frac65⋅\frac67)⋯$$ 派派心想:「誰有時間等你算到無限項!?**等你算好了愛情摩天輪都蓋好了,太平島的石油也都流到台灣來了!**」。於是他只允許利用這個等式算到第 $k$ 項的估計值來當作第一個 $p_{13}$。 另外,在派派氣憤的同時,他發現還有一群人在利用 [蒙地卡羅法](https://zh.wikipedia.org/wiki/%E8%92%99%E5%9C%B0%E5%8D%A1%E7%BE%85%E6%96%B9%E6%B3%95) 來估算 $π$,舉體作法如下:一次估計中選取隨意 $t$ 組亂數 $(x,\ y),\ 0≤x,\ y≤1$ 並計算有幾組的 $(x,\ y)$ 滿足 $\sqrt{x^2+y^2}≤1$。假設有 $c$ 組的 $(x,\ y)$ 滿足 $\sqrt{x^2+y^2}≤1$,則當次估計的 $p_{13}=4⋅\frac ct$ ![](https://i.imgur.com/RiH8jSb.gif) 於是他把 $t=10^7$ 的蒙地卡羅法估算值當作第二個 $p_{13}$,現在請你幫幫派派計算 $∣p_{13}−p_{13}∣$ 四捨五入到小數點後第二位的值為多少。 ### 輸入說明 每筆測資只有一行包含一個整數 $k,\ (0<k≤100)$ 請以此 $k$ 計算第一個 $p_{13}$ 並計算 兩種 $p_{13}$ 的差值,並四捨五入到小數點後第二位後輸出。 ### 輸出說明 輸出一行包含一個浮點數,為該測次測資的 $|p_{13}−p_{13}|$ 估計值。請注意若答案為 $6.3$ 請輸出 $6.30$ ### Hint 要產生在 $[0,1]$ 間的隨機浮點數可引入 `<random>` 並使用 `(double)rand() / RAND_MAX`。 運算過程中的變數型別請使用 `double` 或 `long double`,以免精度誤差造成計算錯誤。 #### 範例輸入 1 ``` 1 ``` #### 範例輸出 1 ``` 0.48 ``` #### 範例輸入 2 ``` 10 ``` #### 範例輸出 2 ``` 0.07 ``` #### 範例輸入 3 ``` 100 ``` #### 範例輸出 3 ``` 0.01 ``` # Code ```cpp #include <iostream> #include <stdlib.h> #include <cmath> #include <iomanip> using namespace std; double p1 = 1, p2, k, x, y, c, n; int main(){ cin >> k; for (double t = 1; t <= k; t++) p1 *= (2 * t / (2 * t - 1)) * (2 * t / (2 * t + 1)); for (n = 0; n < 1e+7; n++) { x = (double)rand()/RAND_MAX; y = (double)rand()/RAND_MAX; if (x * x + y * y <= 1) c++; } p2 = 4 * c / n; p1 *= 2; int out = (abs(p1 - p2) + 0.005) * 100; cout << setiosflags(ios::fixed) << setprecision(2) << (double)out / 100 << endl; } ```