RT,目前已知 WA 是常数小了。
#include<bits/stdc++.h>
#define eps 1e-4
#define inf 0x3f3f3f3f
using namespace std;
int T,n,m,dp[1<<18],t;
double a[19],b[19];
inline int ask(int i,int j,int s){
double a_1=a[i]*a[i],b_1=a[i],c_1=b[i];
double a_2=a[j]*a[j],b_2=a[j],c_2=b[j];
double true_a=(c_2*b_1-c_1*b_2)/(a_2*b_1-a_1*b_2),true_b=(c_2*a_1-c_1*a_2)/(b_2*a_1-b_1*a_2);
if(true_a>=0||fabs(a[i]/b[i]-a[j]/b[j])<=eps){
++t;
return s|(1<<i-1);
}
int ans=s;
for(int qwq=1;qwq<=n;++qwq)
if(!(ans&(1<<qwq-1))&&fabs(true_a*a[qwq]*a[qwq]+true_b*a[qwq]-b[qwq])<=eps)
ans|=(1<<qwq-1),++t;
return ans;
}
inline int dfs(int s,int tot){
if(tot==n)
return 0;
if(tot==n-1)
return 1;
if(dp[s]!=inf)
return dp[s];
for(int i=1;i<=n;++i)
if(!(s&(1<<i-1)))
for(int j=1;j<=n;++j)
if(!(s&(1<<j-1))){
t=tot;
int it=ask(i,j,s);
dp[s]=min(dp[s],dfs(it,t)+1);
if(t==tot+1)
dp[s]=min(dp[s],dfs(s|(1<<j-1),t)+1);
}
return dp[s];
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
scanf("%lf%lf",&a[i],&b[i]);
memset(dp,inf,sizeof(dp));
printf("%d\n",dfs(0,0));
}
return 0;
}