#include<bits/stdc++.h>
#define db double
#define PDD pair<db,db>
#define x first
#define y second
using namespace std;
const db eps=1e-8;
const int N=20;
bool pd(db a,db b){
return fabs(a-b)<eps;
}
int n,m,ans;
db x[N],y[N];
PDD pwx[N],rs[N];
void init(){
ans=1e9;
for(int i=1;i<=20;i++)
x[i]=y[i]=pwx[i].x=pwx[i].y=rs[i].x=rs[i].y=0;
}
void dfs(int c,int v,int sum){
if(sum+v>=ans)return;
if(c>n){
ans=min(ans,v+sum);
return;
}
for(int i=1;i<=sum;i++){
if(pd(pwx[i].x*x[c]*x[c]+pwx[i].y*x[c],y[c])){
dfs(c+1,v,sum);
return;
}
}//不用新增抛物线
for(int i=1;i<=v;i++){
if(pd(rs[i].x,x[c]))continue;
db a=(y[c]*rs[i].x-rs[i].y*x[c])/(x[c]*x[c]*rs[i].x-rs[i].x*rs[i].x*x[c]);
db b=(y[c]-x[c]*x[c]*a)/x[c];
if(a<0){
pwx[sum+1]=make_pair(a,b);
db xx=rs[i].x,yy=rs[i].y;
for(int j=i;j<v;j++)rs[j]=rs[j+1];
dfs(c+1,v-1,sum+1);
for(int j=v;j>i;j--)rs[j]=rs[j-1];
rs[i]=make_pair(xx,yy);
}
}//和原来一个一起新增一条
rs[v+1]=make_pair(x[c],y[c]);
dfs(c+1,v+1,sum);//不被覆盖
}//c:当前看到前c个点
//v:有v个点没被抛物线覆盖
//sum:抛物线数量
void solve(){
init();
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i];
}
dfs(1,0,0);
printf("%d\n",ans);
}
int main(){
// freopen("1.out","w",stdout);
int T;
cin>>T;
while(T--)solve();
// printf("1\n1\n2\n1\n1\n1\n1\n2\n1\n2\n");
return 0;
}
思路是爆搜,第一二个测试点下载本地能过,交上去一分没有