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 ll mod = 1e9 + 7;
- using namespace std;
- ll binpow(ll a, ll n) { // a^n
- if (n == 0) return 1;
- if (n % 2 == 1)
- return (binpow(a, n - 1ll) * a) % mod;
- else {
- ll b = binpow(a, n / 2) % mod;
- return (b * b) % mod;
- }
- }
- vector<bool> dp((1ll << 23), false);
- ll f(ll mask) {
- ll ans = 0;
- ll s = mask;
- while (s) {
- ans = (ans + dp[s]) % mod;
- s = (s - 1) & mask;
- }
- ans = (ans + 1) % mod; // dp[0]
- return ans;
- }
- ll fm[1ll << 23];
- void solve() {
- ll n, m;
- cin >> n >> m;
- ll gmask[n];
- for (auto& el : gmask)
- el = 0;
- for (int i = 0; i < m; ++i) {
- int v, u; cin >> v >> u;
- --u; --v;
- gmask[v] ^= (1ll << u);
- gmask[u] ^= (1ll << v);
- }
- dp[0] = true;
- for (int i = 0; i < n; ++i) {
- dp[1 << i] = true;
- }
- for (ll mask = 0; mask < (1ll << n); ++mask) {
- if (!dp[mask]) continue;
- for (int i = 0; i < n; ++i) {
- if (!((mask >> i) & 1) && (mask & gmask[i]) == 0) {
- dp[mask ^ (1ll << i)] = true;
- }
- }
- }
- for (ll A = 0; A < (1ll << n); ++A) {
- fm[A] = f(A);
- }
- ll res = 0ll;
- for (ll A = 0; A < (1ll << n); ++A) {
- res = (res + (fm[A] * binpow(2, A))) % mod;
- }
- cout << res;
- }
- int main() {
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- cout.tie(nullptr);
- solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment