#include<bits/stdc++.h>
using namespace std;
const int maxn=1<<18;
typedef long long ll;
int f[maxn+5],cnt;
double x[20],y[20],a,b;
int c[20];
void ab(double x1,double y1,double x2,double y2)
{
a=(y1*x2-y2*x1)/(x1*x1*x2-x2*x2*x1);
b=(y1*x2*x2-y2*x1*x1)/(x1*x2*x2-x2*x1*x1);
}
void de(int st)
{
cnt=0;
for(int i=0;st>>i;i++)
{
if((st>>i)&1) c[++cnt]=i+1;
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>x[i]>>y[i];
for(int i=3;i<1<<n;i++)
f[i]=n/2+1;
for(int i=1;i<1<<n;i++){
de(i);
if(cnt==1) { f[i]=1;continue;}
int tt=c[cnt];
for(int j=1;j<cnt;j++){ //选t和c[j]
ab(x[tt],y[tt],x[c[j]],y[c[j]]); //求a,b
int tmp=i;
if(a<0)
{
for(int k=1;k<=cnt;k++)
if(a*x[c[k]]*x[c[k]]+b*x[c[k]]==y[c[k]])
tmp^=(1<<(c[k]-1)); //状态中除去 t(k==cnt),c[j]及其抛物线上的点 -也可
f[i]=min(f[i],f[tmp]+1); //tmp<i,之前的状态已经计算完毕
}
}
f[i]=min(f[i^(1<<(tt-1))]+1,f[i]); // 单独处理当前最后一个
}
cout<<f[(1<<n)-1]<<endl;
}
return 0;
}
```cpp