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:
#define _USE_MATH_DEFINES
#include <cstdio>
#include <iostream>
#include <sstream>
#include <fstream>
#include <iomanip>
#include <algorithm>
#include <cmath>
#include <complex>
#include <string>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <bitset>
#include <numeric>
#include <limits>
#include <climits>
#include <cfloat>
#include <functional>
#include <iterator>
using namespace std;

class Point
{
public:
    double y, x;
    Point(){
        y = x = 0.0;
    }
    Point(double y0, double x0){
        y = y0;
        x = x0;
    }
    Point(double theta){
        y = sin(theta);
        x = cos(theta);
    }
    Point operator+(const Point& p) const{
        return Point(y + p.y, x + p.x);
    }
    Point operator-(const Point& p) const{
        return Point(y - p.y, x - p.x);
    }
    Point operator*(double a) const{
        return Point(y * a, x * a);
    }
    Point operator/(double a) const{
        return Point(y / a, x / a);
    }
    double length() const{
        return sqrt(y * y + x * x);
    }
    double dist(const Point& p) const{
        return sqrt(pow(y - p.y, 2) + pow(x - p.x, 2));
    }
    double dot(const Point& p) const{
        return y * p.y + x * p.x; // |a|*|b|*cosθ
    }
    double cross(const Point& p) const{
        return x * p.y - y * p.x; // |a|*|b|*sinθ
    }
    double angle() const{
        return atan2(y, x);
    }
};

double getArea(const Point& a, const Point& b, const Point& c)
{
    return abs((b - a).cross(c - a) / 2.0);
}

int solve(const vector<Point>& p, int m, double area)
{
    int n = p.size();
    const Point& a = p[0];
    const Point& b = p[m];

    int left = 0;
    int right = (n - m) / 2;
    while(left < right){
        int mid = (left + right + 1) / 2;
        const Point& c = p[m+mid];
        if(getArea(a, b, c) < area)
            left = mid;
        else
            right = mid - 1;
    }

    return min(left * 2, n - 1 - m);
}

int main()
{
    int n;
    long long k;
    cin >> n >> k;

    vector<Point> p(n);
    for(int i=0; i<n; ++i)
        p[i] = Point(2 * M_PI / n * i);

    double left = 0.0;
    double right = M_PI;
    for(int t=0; t<50; ++t){
        double mid = (left + right) / 2.0;
        long long cnt = 0;
        for(int i=1; i<n-1; ++i)
            cnt += solve(p, i, mid) * (long long)n;
        cnt /= 3;

        if(cnt < k)
            left = mid;
        else
            right = mid;
    }
    printf("%.10f\n", left);

    return 0;
}