---
# System prepended metadata

title: 'Estimating $p_{13}−p_{13}$'

---

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