#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ld long double
#define all(x) x.begin(), x.end()
const int N = 1e6 + 5;

using P = array<int, 2>;
void solve(int tc) {
    int n, k;
    cin >> n >> k;
    vector<P> points(n);
    for (auto &[x, y] : points) {
        cin >> x >> y;
    }
    auto quad = [](P p) {
        if (p[0] >= 0 && p[1] >= 0) return 1;
        if (p[0] < 0 && p[1] >= 0) return 2;
        if (p[0] < 0 && p[1] < 0) return 3;
        return 4;
    };
    auto cross = [](P a, P b) { return a[0] * b[1] - a[1] * b[0]; };
    auto dist2 = [](P a) { return a[0] * a[0] + a[1] * a[1]; };
    auto xangle = [](P a) -> long double {
        long double res = atan2l(a[1], a[0]);
        // cout<<res<<endl;
        if (res < 0) {
            res += (2 * acos(-1));
        }
        return res;
    };
    auto angle = [&](P a, P b) {
        long double aA = xangle(a);
        long double aB = xangle(b);
        if (aB < aA) {
            aB += (2 * acos(-1));
        }
        return aB - aA;
    };
    sort(all(points), [&](P a, P b) {
        if (quad(a) != quad(b)) {
            return quad(a) < quad(b);
        }
        if (cross(a, b) != 0) {
            return cross(a, b) > 0;
        }
        return dist2(a) < dist2(b);
    });
    // for(auto [x,y]:points){
    //     cout<<x<<" "<<y<<endl;
    // }
    auto reduce = [](P &a) -> P {
        P F = a;
        // return {1LL,1LL};
        // cout << a[0] << " " << a[1] << endl;
        // return {1LL, 1LL};

        int g = __gcd(a[0], a[1]);
        // cout << g << " ";0
        // return {1, 1};
        F[0] /= g;
        F[1] /= g;
        int s1 = F[0] >= 0;
        int s2 = F[1] >= 0;
        F[0] = abs(F[0]);
        F[1] = abs(F[1]);

        if (F[1] == 0) {
            return {s1, 0};
        } else if (F[0] == 0) {
            return {0, 0};
        } else {
            return {s1 * F[0], F[1]};
        }
    };
    // return;
    long double ans = 0;
    map<array<int,3>, int> mp;
    for(int i = 0; i<n;i++){

    }
    for (int i = 0; i < n; i++) {
        auto r = reduce(points[i]);
        int K = k - mp[{r[0],r[1],quad(points[i])}];
        int next = (i + K) % n;
        ans = max(ans, angle(points[i], points[next]));
        mp[{r[0],r[1],quad(points[i])}]++;
    }
    const double eps = 1e-8;
    if (ans < eps) ans = 2 * acos(-1);
    cout << fixed << setprecision(10) << ans << "\n";
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    int t = 1;
    cin >> t;
    for (int i = 1; i <= t; i++) {
        // cout << "Case " << i << ":\n";
        solve(i);
    }
    return 0;
}