Submission #1015868


Source Code Expand

#include <bits/stdc++.h>
using namespace std;

const int mod = 1000000007;

long long modpow(long long x, int y) {
	if (y == 0) return 1;
	if (y == 1) return x;
	long long z = modpow(x, y/2);
	z = z*z % mod;
	if (y % 2) z = z*x % mod;
	return z;
}

long long modinv(long long x) {
	return modpow(x, mod-2);
}

long long modfact(int n) {
	long long r = 1;
	for (int i = 1; i <= n; ++ i) r = r*i % mod;
	return r;
}

long long modcomb(int n, int k) {
	return modfact(n) * modinv(modfact(k)) % mod * modinv(modfact(n-k)) % mod;
}

struct BComp {
	const vector<vector<int>>& G;
	vector<int> ord;
	vector<int> low;
	vector<pair<int,int>> S;
	vector<vector<pair<int,int>>> bcomp;

	BComp(const vector<vector<int>>& G) : G(G), ord(G.size(),-1), low(G.size()) {
		for (int u = 0; u < (int)G.size(); ++ u) if (ord[u] == -1) {
			ord[u] = low[u] = 0;
			dfs(u, -1);
		}
	}

	int dfs(int u, int p) {
		int cnt=1;
		for (int v : G[u]) if(v != p) {
			if (ord[v] < ord[u])
				S.emplace_back(u,v);
			if (ord[v] == -1) {
				ord[v] = low[v] = ord[u]+cnt;
				cnt += dfs(v, u);
				low[u] = min(low[u],low[v]);
				if (ord[u] <= low[v]) {
					bcomp.emplace_back();
					for (;;) {
						auto e = S.back(); S.pop_back();
						bcomp.back().push_back(e);
						if(e == make_pair(u,v)) break;
					}
				}
			} else {
				low[u] = min(low[u],ord[v]);
			}
		}
	}
};

bool iscycle(const vector<pair<int,int>>& x) {
	set<int> s;
	for (auto p : x) {
		s.insert(p.first);
		s.insert(p.second);
	}
	return s.size() == x.size();
}

int main() {
	int N, M, K;
	vector<vector<int>> G;
	cin >> N >> M >> K;
	G.resize(N);
	for (int i = 0; i < M; ++ i) {
		int x, y;
		cin >> x >> y;
		-- x; -- y;
		G[x].push_back(y);
		G[y].push_back(x);
	}
	BComp a(G);
	long long r = 1;
	for (const auto& x : a.bcomp) {
		if (x.size() == 1) {
			r = (r * K) % mod;
		} else if (iscycle(x)) {
			int n = x.size();
			long long rr = 0;
			for (int i = 0; i < n; ++ i) {
				rr = (rr + modpow(K, __gcd(n, i))) % mod;
			}
			rr = rr * modinv(n) % mod;
			r = (r * rr) % mod;
		} else {
			int m = x.size();
			r = (r * modcomb(m+K-1, K-1)) % mod;
		}
	}
	cout << r << endl;
}

Submission Info

Submission Time
Task F - Painting Graphs with AtCoDeer
User hasi
Language C++14 (GCC 5.4.1)
Score 1300
Code Size 2240 Byte
Status AC
Exec Time 3 ms
Memory 256 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 1300 / 1300
Status
AC × 3
AC × 64
Set Name Test Cases
Sample 0_000.txt, 0_001.txt, 0_002.txt
All 0_000.txt, 0_001.txt, 0_002.txt, 1_003.txt, 1_004.txt, 1_005.txt, 1_006.txt, 1_007.txt, 1_008.txt, 1_009.txt, 1_010.txt, 1_011.txt, 1_012.txt, 1_013.txt, 1_014.txt, 1_015.txt, 1_016.txt, 1_017.txt, 1_018.txt, 1_019.txt, 1_020.txt, 1_021.txt, 1_022.txt, 1_023.txt, 1_024.txt, 1_025.txt, 1_026.txt, 1_027.txt, 1_028.txt, 1_029.txt, 1_030.txt, 1_031.txt, 1_032.txt, 1_033.txt, 1_034.txt, 1_035.txt, 1_036.txt, 1_037.txt, 1_038.txt, 1_039.txt, 1_040.txt, 1_041.txt, 1_042.txt, 1_043.txt, 1_044.txt, 1_045.txt, 1_046.txt, 1_047.txt, 1_048.txt, 1_049.txt, 1_050.txt, 1_051.txt, 1_052.txt, 1_053.txt, 1_054.txt, 1_055.txt, 1_056.txt, 1_057.txt, 1_058.txt, 1_059.txt, 1_060.txt, 1_061.txt, 1_062.txt, 1_063.txt
Case Name Status Exec Time Memory
0_000.txt AC 3 ms 256 KB
0_001.txt AC 3 ms 256 KB
0_002.txt AC 3 ms 256 KB
1_003.txt AC 3 ms 256 KB
1_004.txt AC 3 ms 256 KB
1_005.txt AC 3 ms 256 KB
1_006.txt AC 3 ms 256 KB
1_007.txt AC 3 ms 256 KB
1_008.txt AC 3 ms 256 KB
1_009.txt AC 3 ms 256 KB
1_010.txt AC 3 ms 256 KB
1_011.txt AC 3 ms 256 KB
1_012.txt AC 3 ms 256 KB
1_013.txt AC 3 ms 256 KB
1_014.txt AC 3 ms 256 KB
1_015.txt AC 3 ms 256 KB
1_016.txt AC 3 ms 256 KB
1_017.txt AC 3 ms 256 KB
1_018.txt AC 3 ms 256 KB
1_019.txt AC 3 ms 256 KB
1_020.txt AC 3 ms 256 KB
1_021.txt AC 3 ms 256 KB
1_022.txt AC 3 ms 256 KB
1_023.txt AC 2 ms 256 KB
1_024.txt AC 3 ms 256 KB
1_025.txt AC 3 ms 256 KB
1_026.txt AC 3 ms 256 KB
1_027.txt AC 3 ms 256 KB
1_028.txt AC 3 ms 256 KB
1_029.txt AC 3 ms 256 KB
1_030.txt AC 3 ms 256 KB
1_031.txt AC 3 ms 256 KB
1_032.txt AC 3 ms 256 KB
1_033.txt AC 3 ms 256 KB
1_034.txt AC 3 ms 256 KB
1_035.txt AC 3 ms 256 KB
1_036.txt AC 3 ms 256 KB
1_037.txt AC 3 ms 256 KB
1_038.txt AC 2 ms 256 KB
1_039.txt AC 3 ms 256 KB
1_040.txt AC 2 ms 256 KB
1_041.txt AC 2 ms 256 KB
1_042.txt AC 3 ms 256 KB
1_043.txt AC 3 ms 256 KB
1_044.txt AC 3 ms 256 KB
1_045.txt AC 3 ms 256 KB
1_046.txt AC 3 ms 256 KB
1_047.txt AC 3 ms 256 KB
1_048.txt AC 3 ms 256 KB
1_049.txt AC 3 ms 256 KB
1_050.txt AC 3 ms 256 KB
1_051.txt AC 2 ms 256 KB
1_052.txt AC 3 ms 256 KB
1_053.txt AC 3 ms 256 KB
1_054.txt AC 3 ms 256 KB
1_055.txt AC 3 ms 256 KB
1_056.txt AC 3 ms 256 KB
1_057.txt AC 3 ms 256 KB
1_058.txt AC 3 ms 256 KB
1_059.txt AC 3 ms 256 KB
1_060.txt AC 2 ms 256 KB
1_061.txt AC 3 ms 256 KB
1_062.txt AC 3 ms 256 KB
1_063.txt AC 3 ms 256 KB