#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;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgaW50IGxvbmcgbG9uZwojZGVmaW5lIGxkIGxvbmcgZG91YmxlCiNkZWZpbmUgYWxsKHgpIHguYmVnaW4oKSwgeC5lbmQoKQpjb25zdCBpbnQgTiA9IDFlNiArIDU7Cgp1c2luZyBQID0gYXJyYXk8aW50LCAyPjsKdm9pZCBzb2x2ZShpbnQgdGMpIHsKICAgIGludCBuLCBrOwogICAgY2luID4+IG4gPj4gazsKICAgIHZlY3RvcjxQPiBwb2ludHMobik7CiAgICBmb3IgKGF1dG8gJlt4LCB5XSA6IHBvaW50cykgewogICAgICAgIGNpbiA+PiB4ID4+IHk7CiAgICB9CiAgICBhdXRvIHF1YWQgPSBbXShQIHApIHsKICAgICAgICBpZiAocFswXSA+PSAwICYmIHBbMV0gPj0gMCkgcmV0dXJuIDE7CiAgICAgICAgaWYgKHBbMF0gPCAwICYmIHBbMV0gPj0gMCkgcmV0dXJuIDI7CiAgICAgICAgaWYgKHBbMF0gPCAwICYmIHBbMV0gPCAwKSByZXR1cm4gMzsKICAgICAgICByZXR1cm4gNDsKICAgIH07CiAgICBhdXRvIGNyb3NzID0gW10oUCBhLCBQIGIpIHsgcmV0dXJuIGFbMF0gKiBiWzFdIC0gYVsxXSAqIGJbMF07IH07CiAgICBhdXRvIGRpc3QyID0gW10oUCBhKSB7IHJldHVybiBhWzBdICogYVswXSArIGFbMV0gKiBhWzFdOyB9OwogICAgYXV0byB4YW5nbGUgPSBbXShQIGEpIC0+IGxvbmcgZG91YmxlIHsKICAgICAgICBsb25nIGRvdWJsZSByZXMgPSBhdGFuMmwoYVsxXSwgYVswXSk7CiAgICAgICAgLy8gY291dDw8cmVzPDxlbmRsOwogICAgICAgIGlmIChyZXMgPCAwKSB7CiAgICAgICAgICAgIHJlcyArPSAoMiAqIGFjb3MoLTEpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlczsKICAgIH07CiAgICBhdXRvIGFuZ2xlID0gWyZdKFAgYSwgUCBiKSB7CiAgICAgICAgbG9uZyBkb3VibGUgYUEgPSB4YW5nbGUoYSk7CiAgICAgICAgbG9uZyBkb3VibGUgYUIgPSB4YW5nbGUoYik7CiAgICAgICAgaWYgKGFCIDwgYUEpIHsKICAgICAgICAgICAgYUIgKz0gKDIgKiBhY29zKC0xKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhQiAtIGFBOwogICAgfTsKICAgIHNvcnQoYWxsKHBvaW50cyksIFsmXShQIGEsIFAgYikgewogICAgICAgIGlmIChxdWFkKGEpICE9IHF1YWQoYikpIHsKICAgICAgICAgICAgcmV0dXJuIHF1YWQoYSkgPCBxdWFkKGIpOwogICAgICAgIH0KICAgICAgICBpZiAoY3Jvc3MoYSwgYikgIT0gMCkgewogICAgICAgICAgICByZXR1cm4gY3Jvc3MoYSwgYikgPiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZGlzdDIoYSkgPCBkaXN0MihiKTsKICAgIH0pOwogICAgLy8gZm9yKGF1dG8gW3gseV06cG9pbnRzKXsKICAgIC8vICAgICBjb3V0PDx4PDwiICI8PHk8PGVuZGw7CiAgICAvLyB9CiAgICBhdXRvIHJlZHVjZSA9IFtdKFAgJmEpIC0+IFAgewogICAgICAgIFAgRiA9IGE7CiAgICAgICAgLy8gcmV0dXJuIHsxTEwsMUxMfTsKICAgICAgICAvLyBjb3V0IDw8IGFbMF0gPDwgIiAiIDw8IGFbMV0gPDwgZW5kbDsKICAgICAgICAvLyByZXR1cm4gezFMTCwgMUxMfTsKCiAgICAgICAgaW50IGcgPSBfX2djZChhWzBdLCBhWzFdKTsKICAgICAgICAvLyBjb3V0IDw8IGcgPDwgIiAiOzAKICAgICAgICAvLyByZXR1cm4gezEsIDF9OwogICAgICAgIEZbMF0gLz0gZzsKICAgICAgICBGWzFdIC89IGc7CiAgICAgICAgaW50IHMxID0gRlswXSA+PSAwOwogICAgICAgIGludCBzMiA9IEZbMV0gPj0gMDsKICAgICAgICBGWzBdID0gYWJzKEZbMF0pOwogICAgICAgIEZbMV0gPSBhYnMoRlsxXSk7CgogICAgICAgIGlmIChGWzFdID09IDApIHsKICAgICAgICAgICAgcmV0dXJuIHtzMSwgMH07CiAgICAgICAgfSBlbHNlIGlmIChGWzBdID09IDApIHsKICAgICAgICAgICAgcmV0dXJuIHswLCAwfTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4ge3MxICogRlswXSwgRlsxXX07CiAgICAgICAgfQogICAgfTsKICAgIC8vIHJldHVybjsKICAgIGxvbmcgZG91YmxlIGFucyA9IDA7CiAgICBtYXA8YXJyYXk8aW50LDM+LCBpbnQ+IG1wOwogICAgZm9yKGludCBpID0gMDsgaTxuO2krKyl7CgogICAgfQogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBhdXRvIHIgPSByZWR1Y2UocG9pbnRzW2ldKTsKICAgICAgICBpbnQgSyA9IGsgLSBtcFt7clswXSxyWzFdLHF1YWQocG9pbnRzW2ldKX1dOwogICAgICAgIGludCBuZXh0ID0gKGkgKyBLKSAlIG47CiAgICAgICAgYW5zID0gbWF4KGFucywgYW5nbGUocG9pbnRzW2ldLCBwb2ludHNbbmV4dF0pKTsKICAgICAgICBtcFt7clswXSxyWzFdLHF1YWQocG9pbnRzW2ldKX1dKys7CiAgICB9CiAgICBjb25zdCBkb3VibGUgZXBzID0gMWUtODsKICAgIGlmIChhbnMgPCBlcHMpIGFucyA9IDIgKiBhY29zKC0xKTsKICAgIGNvdXQgPDwgZml4ZWQgPDwgc2V0cHJlY2lzaW9uKDEwKSA8PCBhbnMgPDwgIlxuIjsKfQoKc2lnbmVkIG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKE5VTEwpOwogICAgaW50IHQgPSAxOwogICAgY2luID4+IHQ7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSB0OyBpKyspIHsKICAgICAgICAvLyBjb3V0IDw8ICJDYXNlICIgPDwgaSA8PCAiOlxuIjsKICAgICAgICBzb2x2ZShpKTsKICAgIH0KICAgIHJldHVybiAwOwp9