Submission #73704151


Source Code Expand

#include <iostream>
#include <vector>
using namespace std;

long long MOD = 998244353;
// long long MOD = int(1e9)+7;
struct modint {
	long long x;

	modint(long long x=0) : x((x % MOD + MOD) % MOD) {}

	long long val() const { return x; }

	modint& operator+=(const modint a) { if ((x += a.x)>=MOD) x -= MOD; return *this; }
	modint& operator-=(const modint a) { if ((x += MOD - a.x)>=MOD) x -= MOD; return *this; }
	modint& operator*=(const modint a) { (x *= a.x) %= MOD; return *this; }
	modint& operator/=(const modint a) { return *this *= a.inv(); }

	friend modint operator+(modint a, const modint b) { return a += b; }
	friend modint operator-(modint a, const modint b) { return a -= b; }
	friend modint operator*(modint a, const modint b) { return a *= b; }
	friend modint operator/(modint a, const modint b) { return a /= b; }

	modint& operator++() { if (++x == MOD) x = 0; return *this; }
	modint& operator--() { if (x == 0) x = MOD; --x; return *this; }
	modint operator++(int) { modint res = *this; ++*this; return res; }
	modint operator--(int) { modint res = *this; --*this; return res; }

	bool operator==(const modint a) const { return x == a.x; }
	bool operator!=(const modint a) const { return x != a.x; }
	modint operator-() const { return (x==0) ? 0 : MOD-x; }

	modint pow(long long t) const {
		modint res=1, a=*this;
		while (t>0) {
			if (t&1) res *= a;
			a *= a;
			t >>= 1;
		}
		return res;
	}
	modint inv() const { return pow(MOD-2); }

	friend ostream& operator<<(ostream& os, const modint& a) { return os<<a.x; }
	friend istream& operator>>(istream& is, modint& a) {
		long long t; is >> t;
		a = modint(t);
		return is;
	}
};

struct UnionFind {
	vector<int> parent;

	UnionFind(int N) : parent(N, -1) {}
	
	int root(int x) {
		if (parent[x] < 0) return x;
		return parent[x] = root(parent[x]);
	}

	int size(int x){
		return -parent[root(x)];
	}

	bool is_same(int x, int y) {
		return root(x) == root(y);
	}

	bool unite(int x, int y) {
		x = root(x); y = root(y);
		if (x == y) return false;
		if (parent[x]>parent[y]) swap(x, y);
		parent[x] += parent[y];
		parent[y] = x;
		return true;
	}
};

int main(){
	int N, M; cin>>N>>M;
	vector<pair<int, int>> edge(M);
	for (int i=0; i<M; i++){
		int U, V; cin>>U>>V; U--; V--;
		edge[i] = {U, V};
	}
	modint ans = modint(2).pow(M+1);
	ans--;
	int comp = N;
	UnionFind uf(N);
	for (int i=M-1; i>=0; i--){
		if (comp!=2){
			if (uf.unite(edge[i].first, edge[i].second)) comp--;
			ans -= modint(2).pow(i+1);
		} else {
			if (uf.is_same(edge[i].first, edge[i].second)){
				ans -= modint(2).pow(i+1);
			}
		}
	}
	cout<<ans-1<<endl;
}

Submission Info

Submission Time
Task E - Divide Graph
User circled_9
Language C++23 (GCC 15.2.0)
Score 475
Code Size 2714 Byte
Status AC
Exec Time 80 ms
Memory 5856 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 475 / 475
Status
AC × 3
AC × 36
Set Name Test Cases
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_random_00.txt, 01_random_01.txt, 01_random_02.txt, 01_random_03.txt, 01_random_04.txt, 01_random_05.txt, 01_random_06.txt, 01_random_07.txt, 01_random_08.txt, 01_random_09.txt, 01_random_10.txt, 01_random_11.txt, 01_random_12.txt, 01_random_13.txt, 01_random_14.txt, 02_perfect_00.txt, 02_perfect_01.txt, 02_perfect_02.txt, 02_perfect_03.txt, 02_perfect_04.txt, 02_perfect_05.txt, 02_perfect_06.txt, 02_perfect_07.txt, 02_perfect_08.txt, 03_tree_00.txt, 03_tree_01.txt, 03_tree_02.txt, 03_tree_03.txt, 03_tree_04.txt, 03_tree_05.txt, 03_tree_06.txt, 04_handmade_00.txt, 04_handmade_01.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 1 ms 3712 KiB
00_sample_01.txt AC 1 ms 3692 KiB
00_sample_02.txt AC 1 ms 3692 KiB
01_random_00.txt AC 54 ms 4692 KiB
01_random_01.txt AC 47 ms 4696 KiB
01_random_02.txt AC 41 ms 4396 KiB
01_random_03.txt AC 4 ms 3804 KiB
01_random_04.txt AC 51 ms 4724 KiB
01_random_05.txt AC 43 ms 4416 KiB
01_random_06.txt AC 34 ms 4284 KiB
01_random_07.txt AC 34 ms 4276 KiB
01_random_08.txt AC 51 ms 4660 KiB
01_random_09.txt AC 36 ms 4320 KiB
01_random_10.txt AC 75 ms 5564 KiB
01_random_11.txt AC 74 ms 5592 KiB
01_random_12.txt AC 77 ms 5684 KiB
01_random_13.txt AC 49 ms 4960 KiB
01_random_14.txt AC 67 ms 5424 KiB
02_perfect_00.txt AC 59 ms 4924 KiB
02_perfect_01.txt AC 58 ms 4928 KiB
02_perfect_02.txt AC 57 ms 4928 KiB
02_perfect_03.txt AC 54 ms 4916 KiB
02_perfect_04.txt AC 58 ms 4952 KiB
02_perfect_05.txt AC 52 ms 4868 KiB
02_perfect_06.txt AC 57 ms 4860 KiB
02_perfect_07.txt AC 58 ms 4804 KiB
02_perfect_08.txt AC 57 ms 4916 KiB
03_tree_00.txt AC 79 ms 5824 KiB
03_tree_01.txt AC 80 ms 5748 KiB
03_tree_02.txt AC 75 ms 5756 KiB
03_tree_03.txt AC 78 ms 5816 KiB
03_tree_04.txt AC 77 ms 5856 KiB
03_tree_05.txt AC 79 ms 5848 KiB
03_tree_06.txt AC 79 ms 5848 KiB
04_handmade_00.txt AC 1 ms 3676 KiB
04_handmade_01.txt AC 76 ms 5824 KiB