RT。
Loj上有差5ms卡进的。
#include<bits/stdc++.h>
using namespace std;
constexpr int mod=1e8+7;
bool g[20][22][(1<<19)];
int n,res=0,f[(1<<19)][20],x[20],y[20],t,Low;
bool check(const int &i,const int &j){
if((x[t] - x[i]) * (y[j] - y[i]) ==(x[j] - x[i]) * (y[t] - y[i])
&& min(x[i] , x[j])<=x[t] && x[t] <= max(x[i] , x[j])
&& min(y[i] , y[j])<=y[t] && y[t] <= max(y[i] , y[j]))
return 0;
return 1;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i)scanf("%d%d",&x[i],&y[i]);
for(int i=1;i<=n;++i){
for(int j=1;j<=n;j+=5){
g[i][j][0]=1;
g[i][j+1][0]=1;
g[i][j+2][0]=1;
g[i][j+3][0]=1;
g[i][j+4][0]=1;
g[i][j+5][0]=1;
}
}
for(int s=1;s<(1<<n);s++){
Low=s&(-s);
t=__lg(Low)+1;
for(int i=1;i<=n;++i){
if(!(s&(1<<i-1))){
for(int j=1;j<=n;++j)
if(!(s&(1<<j-1))&&i!=j)g[i][j][s]=(g[i][j][s^Low]&&check(i,j));
}
}
}
for(int i=1;i<=n;i++)f[(1<<i-1)][i]=1;
for(int s=1;s<(1<<n);++s){
for(int i=1;i<=n;++i){
if(!f[s][i])continue;
if((s&(1<<i-1))){
for(int j=1;j<=n;++j)
if(!(s&(1<<j-1))){
int ns=(s|(1<<j-1));
if(g[i][j][((1<<n)-1)^s^(1<<j-1)])
f[ns][j]+=f[s][i],f[ns][j]=(f[ns][j]%mod+mod)%mod;
}
}
}
}
for(int s=15;s<(1<<n);++s){
if(__builtin_popcount(s)<(1<<2))continue;
for(int i=1;i<=n;++i)
if(s&(1<<i-1))res+=f[s][i],res%=mod;
}
printf("%d\n",res);
}