voidInput(){ scanf("%d%d", &n, &m); int u, v; for (int i = 1; i <= m; i++) { scanf("%d%d", &u, &v); mp[u][v] = mp[v][u] = 1; } }
voidInit(){ for (int i = 1; i <= n; i++) { dp[1 << (i - 1)][i] = 1; } }
voidWork(){ Init(); longlong ans = 0; for (int mask = 1; mask < (1 << n); mask++) { for (int u = 1; u <= n; u++) { if (!dp[mask][u]) continue;
int fir = 0; for (int i = 1; i <= n; i++) { if (mask & (1 << (i - 1))) { fir = i; break; } }
for (int v = fir; v <= n; v++) { if (mp[u][v]) { if (v == fir) { ans += dp[mask][u]; } else { if (!(mask & (1 << (v - 1)))) { dp[mask | (1 << (v - 1))][v] += dp[mask][u]; } } } } } } printf("%lld", (ans - m) / 2); }