http://oj.daimayuan.top/problem/704
#include<bits/stdc++.h>
using namespace std;
const int N=20,M=1<<N;
long long f[M][N],n,m,g[N][N];
long long ans;
int lowbit(int x){return (int)log2(x&-x);}
int cal(int x){
int cnt=0;
while(x)cnt+=x&1,x>>=1;
return cnt;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
int mm=m;
while(m--){
int a,b;
cin>>a>>b;
a--,b--;
g[a][b]=g[b][a]=1;
//f[(1<<a)|(1<<b)][max(a,b)]=1;
}
for(int i=0;i<n;i++)f[1<<i][i]=1;
for(int i=1;i<1<<n;i++){
int u=lowbit(i);
for(int j=0;j<n;j++){//j表示我现在走到了点集的哪个点上
if(!(i>>j&1))continue;
if(g[u][j])ans+=f[i][j];
for(int k=u+1;k<n;k++){//k表示我现在要走到哪个点
if(i>>k&1)continue;
if(!g[j][k])continue;
f[i|(1<<k)][k]+=f[i][j];
}
}
}
cout<<(ans-mm)/2;
}