Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <unordered_map>
- #include <string>
- #include <map>
- #include <cmath>
- #include <algorithm>
- #include <set>
- #define ll long long
- #define len(v) (int)v.size()
- #define all(v) v.begin(), v.end()
- const ll maxn = 2e5 + 10;
- const int logn = 20;
- const ll inf = 1e18;
- const int mod = 1e9 + 7;
- using namespace std;
- vector<bool> dp((1 << 23), false);
- int f(int mask) {
- int ans = 0;
- int s = mask;
- while (s) {
- ans += dp[s];
- ans = ((ans % mod) + mod) % mod;
- s = (s - 1) & mask;
- }
- ans = (ans + 1) % mod; // dp[0]
- return ans;
- }
- int fm2[1 << 23];
- int bin_pow2[1 << 23];
- void solve() {
- int n, m;
- cin >> n >> m;
- vector<ll> gmask(n, 0);
- for (int i = 0; i < m; ++i) {
- int v, u; cin >> v >> u;
- --u; --v;
- gmask[v] ^= (1 << u);
- gmask[u] ^= (1 << v);
- }
- dp[0] = true;
- for (int i = 0; i < n; ++i) {
- dp[1 << i] = true;
- }
- for (int mask = 0; mask < (1 << n); ++mask) {
- if (!dp[mask]) continue;
- for (int i = 0; i < n; ++i) {
- if (!((mask >> i) & 1) && (mask & gmask[i]) == 0) {
- dp[mask ^ (1 << i)] = true;
- }
- }
- }
- for (int A = 0; A < (1 << n); ++A) {
- fm2[A] = f(A) % mod;
- }
- bin_pow2[0] = 1;
- for (int i = 1; i < (1 << 23); ++i) {
- bin_pow2[i] = (bin_pow2[i - 1] * 2) % mod;
- }
- int res2 = 0;
- for (int A = 0; A < (1 << n); ++A) {
- res2 = ((ll)res2 + ((ll)fm2[A] * (ll)bin_pow2[A]) % mod) % mod;
- }
- cout << res2;
- }
- signed main() {
- ios::sync_with_stdio(false);
- cin.tie(nullptr);
- cout.tie(nullptr);
- solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement