# codeforce 11D A Simple Task

Given a simple graph, output the number of simple cycles in it. A simple cycle is a cycle with no repeated vertices or edges.

Input
The first line of input contains two integers n and m (1 ≤ n ≤ 19, 0 ≤ m) – respectively the number of vertices and edges of the graph. Each of the subsequent m lines contains two integers a and b, (1 ≤ a, b ≤ n, a ≠ b) indicating that vertices a and b are connected by an undirected edge. There is no more than one edge connecting any pair of vertices.

Output
Output the number of cycles in the given graph.

Examples
input
4 6
1 2
1 3
1 4
2 3
2 4
3 4
output
7
Note
The example graph is a clique and contains four cycles of length 3 and three cycles of length 4.

#include <cstdio>
using namespace std;
long long f[1<<19][19],map[20][20],n,m,x,y;
int start(int now)
{
for (int i=0;i<n;i++)
if ((1<<i)&now)
return i;
}
main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
scanf("%d%d",&x,&y),x--,y--,
map[x][y]=1,map[y][x]=1;
long long ans=0,cnt=(1<<n)-1;
for (int i=0;i<n;i++)
f[1<<i][i]=1;
for (int i=1;i<=cnt;i++)
for (int j=0;j<n;j++)
if (f[i][j])
{
int st=start(i);
for (int k=st;k<n;k++)
if (j!=k && map[j][k])
if (i&(1<<k))
if (k==st)
ans+=f[i][j];
else;
else
f[i|(1<<k)][k]+=f[i][j];
}
ans-=m;
ans/=2;
printf("%lld\n",ans);
}