256372026-02-23 20:06:11GeneratrollTrükkcpp17Accepted 60/6027ms856 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int t;
	cin >> t;
	auto q = [](ll b, ll e) {
		ll r = 1;
		while (e > 0) {
			if (e % 2 == 1) {
				r = (r * b) % 1000000007;
			}
			b = (b * b) % 1000000007;
			e = e / 2;
		}
		return r;
	};
	while (t--) {
		int n, k;
		cin >> n >> k;
		vector<int> p(n + 1), d(n + 1, 0), s(n + 1, 1);
		iota(p.begin(), p.end(), 0);
		int m = n + 1, o = 1;
		auto f = [&](auto self, int i) -> int {
			if (p[i] == i) {
				return i;
			}
			int r = self(self, p[i]);
			d[i] = d[i] ^ d[p[i]];
			p[i] = r;
			return r;
		};
		for (int i = 0; i < k; i++) {
			int a, b;
			cin >> a >> b;
			if (o == 0) {
				continue;
			}
			int u = a - 1, v = b;
			int x = f(f, u), y = f(f, v);
			if (x != y) {
				if (s[x] < s[y]) {
					swap(x, y);
					swap(u, v);
				}
				p[y] = x;
				d[y] = d[u] ^ d[v] ^ 1;
				s[x] = s[x] + s[y];
				m--;
			} else {
				if (d[u] == d[v]) {
					o = 0;
				}
			}
		}
		if (o == 0) {
			cout << 0 << '\n';
		} else {
			cout << q(2, m - 1) << '\n';
		}
	}
	return 0;
}

SubtaskSumTestVerdictTimeMemory
base60/60
1Accepted0/01ms316 KiB
2Accepted0/013ms564 KiB
3Accepted3/31ms316 KiB
4Accepted3/31ms316 KiB
5Accepted3/31ms316 KiB
6Accepted3/31ms316 KiB
7Accepted2/226ms612 KiB
8Accepted2/224ms652 KiB
9Accepted2/225ms612 KiB
10Accepted2/226ms596 KiB
11Accepted2/224ms656 KiB
12Accepted2/225ms656 KiB
13Accepted2/224ms664 KiB
14Accepted2/223ms660 KiB
15Accepted2/223ms612 KiB
16Accepted2/224ms660 KiB
17Accepted2/224ms656 KiB
18Accepted2/223ms612 KiB
19Accepted2/227ms612 KiB
20Accepted2/226ms664 KiB
21Accepted2/225ms612 KiB
22Accepted2/224ms612 KiB
23Accepted2/224ms612 KiB
24Accepted2/224ms612 KiB
25Accepted2/224ms660 KiB
26Accepted2/223ms856 KiB
27Accepted2/226ms652 KiB
28Accepted2/224ms612 KiB
29Accepted2/213ms616 KiB
30Accepted2/212ms656 KiB