//{ Driver Code Starts
#include <bits/stdc++.h>
using namespace std;
class Matrix {
public:
template <class T>
static void input(vector<vector<T>> &A, int n, int m) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
scanf("%d ", &A[i][j]);
}
}
}
template <class T>
static void print(vector<vector<T>> &A) {
for (int i = 0; i < A.size(); i++) {
for (int j = 0; j < A[i].size(); j++) {
cout << A[i][j] << " ";
}
cout << endl;
}
}
};
// } Driver Code Ends
class Solution {
public:
int countTrips(vector<vector<int>> &locations) {
int n = locations.size();
vector<int>slopes;
for(auto location : locations){
for(int i=0;i<2;i++){
int y = location[1];
int x = location[0];
if(x==0 && y==0) {
n--;
continue;
}
if(x != 0){
int m = y/x;
slopes.push_back(m);
}
else slopes.push_back(y);
}
}
for(auto it: slopes) cout<<it<<" ";
unordered_map<int,int>mpp;
for(int i=0;i<slopes.size();i++){
mpp[i]++;
}
int largest = 0;
for(auto &p : mpp){
if(p.second>largest)largest=p.second;
}
return n-largest+1;
}
};
//{ Driver Code Starts.
int main() {
int t;
scanf("%d ", &t);
while (t--) {
int n;
scanf("%d", &n);
vector<vector<int>> locations(n, vector<int>(2));
Matrix::input(locations, n, 2);
Solution obj;
int res = obj.countTrips(locations);
cout << res << endl;
cout << "~" << endl;
}
}
// } Driver Code Ends
Ly97IERyaXZlciBDb2RlIFN0YXJ0cwojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIE1hdHJpeCB7CiAgcHVibGljOgogICAgdGVtcGxhdGUgPGNsYXNzIFQ+CiAgICBzdGF0aWMgdm9pZCBpbnB1dCh2ZWN0b3I8dmVjdG9yPFQ+PiAmQSwgaW50IG4sIGludCBtKSB7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtOyBqKyspIHsKICAgICAgICAgICAgICAgIHNjYW5mKCIlZCAiLCAmQVtpXVtqXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgdGVtcGxhdGUgPGNsYXNzIFQ+CiAgICBzdGF0aWMgdm9pZCBwcmludCh2ZWN0b3I8dmVjdG9yPFQ+PiAmQSkgewogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQS5zaXplKCk7IGkrKykgewogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IEFbaV0uc2l6ZSgpOyBqKyspIHsKICAgICAgICAgICAgICAgIGNvdXQgPDwgQVtpXVtqXSA8PCAiICI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY291dCA8PCBlbmRsOwogICAgICAgIH0KICAgIH0KfTsKCgovLyB9IERyaXZlciBDb2RlIEVuZHMKCgpjbGFzcyBTb2x1dGlvbiB7CiAgcHVibGljOgogICAgaW50IGNvdW50VHJpcHModmVjdG9yPHZlY3RvcjxpbnQ+PiAmbG9jYXRpb25zKSB7CiAgICAgICAgaW50IG4gPSBsb2NhdGlvbnMuc2l6ZSgpOwogICAgICAgIHZlY3RvcjxpbnQ+c2xvcGVzOwogICAgICAgIGZvcihhdXRvIGxvY2F0aW9uIDogbG9jYXRpb25zKXsKICAgICAgICAgICAgZm9yKGludCBpPTA7aTwyO2krKyl7CiAgICAgICAgICAgICAgICBpbnQgeSA9IGxvY2F0aW9uWzFdOwogICAgICAgICAgICAgICAgaW50IHggPSBsb2NhdGlvblswXTsKICAgICAgICAgICAgICAgIGlmKHg9PTAgJiYgeT09MCkgewogICAgICAgICAgICAgICAgICAgIG4tLTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmKHggIT0gMCl7CiAgICAgICAgICAgICAgICAgICAgaW50IG0gPSB5L3g7CiAgICAgICAgICAgICAgICAgICAgc2xvcGVzLnB1c2hfYmFjayhtKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2Ugc2xvcGVzLnB1c2hfYmFjayh5KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IoYXV0byBpdDogc2xvcGVzKSBjb3V0PDxpdDw8IiAiOwogICAgICAgIHVub3JkZXJlZF9tYXA8aW50LGludD5tcHA7CiAgICAgICAgZm9yKGludCBpPTA7aTxzbG9wZXMuc2l6ZSgpO2krKyl7CiAgICAgICAgICAgIG1wcFtpXSsrOwogICAgICAgIH0KICAgICAgICBpbnQgbGFyZ2VzdCA9IDA7CiAgICAgICAgZm9yKGF1dG8gJnAgOiBtcHApewogICAgICAgICAgICBpZihwLnNlY29uZD5sYXJnZXN0KWxhcmdlc3Q9cC5zZWNvbmQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuLWxhcmdlc3QrMTsKICAgIH0KfTsKCgoKLy97IERyaXZlciBDb2RlIFN0YXJ0cy4KCmludCBtYWluKCkgewogICAgaW50IHQ7CiAgICBzY2FuZigiJWQgIiwgJnQpOwogICAgd2hpbGUgKHQtLSkgewoKICAgICAgICBpbnQgbjsKICAgICAgICBzY2FuZigiJWQiLCAmbik7CgogICAgICAgIHZlY3Rvcjx2ZWN0b3I8aW50Pj4gbG9jYXRpb25zKG4sIHZlY3RvcjxpbnQ+KDIpKTsKICAgICAgICBNYXRyaXg6OmlucHV0KGxvY2F0aW9ucywgbiwgMik7CgogICAgICAgIFNvbHV0aW9uIG9iajsKICAgICAgICBpbnQgcmVzID0gb2JqLmNvdW50VHJpcHMobG9jYXRpb25zKTsKCiAgICAgICAgY291dCA8PCByZXMgPDwgZW5kbDsKICAgICAgICBjb3V0IDw8ICJ+IiA8PCBlbmRsOwogICAgfQp9CgovLyB9IERyaXZlciBDb2RlIEVuZHM=