Problem: Input

The input is given from Standard Input in the following format:


> $N \ K$

Output

* Please output the $K$-th triangle area.
* Print a floating number denoting the answer. The relative or absolute error of your answer should not be higher than $10^{−9}$.



Constraints

* $3 \le N \le 200,000$
* $1 \le K \le \frac{N(N-1)(N-2)}{6}$



Subtasks

Subtask 1 [ $160$ points ]


* $N \le 100$

Subtask 2 [ $240$ points ]


* $N \le 1000$

Subtask 3 [ $450$ points ]


* $N \le 200,000$

Output

* Please output the $K$-th triangle area.
* Print a floating number denoting the answer. The relative or absolute error of your answer should not be higher than $10^{−9}$.



Constraints

* $3 \le N \le 200,000$
* $1 \le K \le \frac{N(N-1)(N-2)}{6}$



Subtasks

Subtask 1 [ $160$ points ]


* $N \le 100$

Subtask 2 [ $240$ points ]


* $N \le 1000$

Subtask 3 [ $450$ points ]


* $N \le 200,000$

Input

The input is given from Standard Input in the following format:


> $N \ K$

Examples

Input

4 3


Output

1.0000000000000


Input

6 9


Output

0.86602540378


Input

12 220


Output

1.29903810568

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
#define REP(i, n, s) for (int i = (s); i < (n); i++)
#define PI 3.141592653589793
#define EPS 1e-15
#define SIZE 200001
using namespace std;
typedef long long int LL;
typedef long double LD;

int N;
LL K;
double s[SIZE];

// Count number of triangles whose area is less than X
// Another point comes right to others.
// i : position of the point
// X : target area size
int count(int i, double X) {
	int all = (N - i) / 2;
	int l = 0, r = all + 1;
	while(r - l > 1) {
		int m = (l + r) / 2;
		double area = (s[i] + s[m] + s[N - i - m]) / 2.0;
//		if (area > X + EPS) r = m;
		if (area > X) r = m;
		else l = m;
	}
	if (r == all + 1) return N - i - 1;
	return l * 2;
}

bool check(double X) {
	LL sum = 0;
	REP(i, N - 1, 1) {
		sum += count(i, X);
	}
	return sum * N >= 3 * K;
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> N >> K;
	REP(i, N+1, 0) {
		s[i] = sin(2.0*PI*(double)i/(double)N);
	}
	double l = 0.0, r = 2.0 * PI;
	// (1/2)^50 = 8.881784197001252e-16
	REP(i, 50, 0) {
		double m = (l + r) / 2;
		if (check(m)) r = m;
		else l = m;
	}
	cout << fixed << setprecision(20) << r << endl;
	return 0;
}