Submission #931089


Source Code Expand

#define _USE_MATH_DEFINES
#include <algorithm>
#include <cstdio>
#include <functional>
#include <iostream>
#include <cfloat>
#include <climits>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <time.h>
#include <vector>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> i_i;
typedef pair<ll, int> ll_i;
typedef pair<double, int> d_i;
typedef pair<ll, ll> ll_ll;
typedef pair<double, double> d_d;
struct edge { int u, v; ll w; };

ll MOD = 1000000007;
ll _MOD = 1000000009;
double EPS = 1e-10;

int t;
vector<int> unko;

int gcd(int a, int b) {
	return b ? gcd(b, a % b) : a;
}

bool dfs(int u, int p, vector<vector<int> >& G, vector<int>& path, vector<bool>& vis, bool flag) {
	if (vis[u]) return false;
	vis[u] = true;
	path.push_back(u);
	if (u == t) {
		unko = path;
		return true;
	}
	if (flag) reverse(G[u].begin(), G[u].end());
	for (int v: G[u]) {
		if (v == p) continue;
		if (dfs(v, u, G, path, vis, flag)) {
			if (flag) reverse(G[u].begin(), G[u].end());
			return true;
		}
	}
	path.pop_back();
	if (flag) reverse(G[u].begin(), G[u].end());
	return false;
}

ll extgcd(ll a, ll b, ll& x, ll& y) {
	if (b == 0) {
		x = (a >= 0) ? 1 : -1;
		y = 0;
		return abs(a);
	}
	else {
		ll res = extgcd(b, a % b, y, x);
		y -= (a / b) * x;
		return res;
	}
}

ll mod_inverse(ll a, ll m) {
	ll x, y;
	extgcd(a, m, x, y);
	return (m + x % m) % m;
}

ll c(ll n, ll k) {
	ll res = 1;
	for (int i = 0; i < k; i++)
		res = (res * ((n - i) % 1000000007)) % 1000000007;
	for (int i = 1; i <= k; i++)
		res = (res * mod_inverse(i, 1000000007)) % 1000000007;
	return res;
}

struct union_find {
	vector<int> v;
	union_find(int n) : v(n, -1) {}
	int find(int x) { return (v[x] < 0) ? x : (v[x] = find(v[x])); }
	void unite(int x, int y) {
		x = find(x); y = find(y);
		if (x != y) {
			if (-v[x] < -v[y]) swap(x, y);
			v[x] += v[y]; v[y] = x;
		}
	}
	bool same(int x, int y) { return find(x) == find(y); }
	int size(int x) { return -v[find(x)]; }
};

int main() {
	int N, M, K;
	cin >> N >> M >> K;
	vector<int> a(M), b(M);
	for (int i = 0; i < M; i++) {
		cin >> a[i] >> b[i];
		a[i]--; b[i]--;
	}
	vector<vector<int> > G(N);
	for (int i = 0; i < M; i++) {
		G[a[i]].push_back(b[i]);
		G[b[i]].push_back(a[i]);
	}
	ll ans = 1;
	union_find uf(N);
	union_find uf2(N);
	set<set<int> > hoge;
	for (int i = 0; i < M; i++) {
		vector<int> a1, a2;
		t = b[i];
		{
			unko.clear();
			vector<int> path;
			vector<bool> vis(N);
			dfs(a[i], b[i], G, path, vis, false);
			a1 = unko;
		}
		{
			unko.clear();
			vector<int> path;
			vector<bool> vis(N);
			dfs(a[i], b[i], G, path, vis, true);
			a2 = unko;
		}
		if (a1.empty()) {
			ans = ans * K % MOD;
		}
		else if (a1 == a2) {
			set<int> poyo;
			for (int u: a1) poyo.insert(u);
			hoge.insert(poyo);
		}
		else {
			uf.unite(a[i], b[i]);
			uf.unite(a[i], a1[1]);
			uf.unite(a[i], a2[1]);
		}
	}
	for (int u = 0; u < N; u++)
		if (uf.find(u)==u && uf.size(u) > 1) {
			int n = 0;
			for (int i = 0; i < M; i++)
				if (uf.find(a[i]) == u && uf.find(b[i]) == u)
					n++;
			ans = ans * c(n + K - 1, K - 1) % MOD;
		}
	for (set<int> poyo: hoge)
		if (true) {
			int n = poyo.size();
			ll sum = 0;
			for (int d = 0; d < n; d++) {
				int k = gcd(n, d);
				ll x = 1;
				while (k--) x = x * K % MOD;
				sum = (sum + x) % MOD;
			}
			ans = ans * sum % MOD * mod_inverse(n, MOD) % MOD;
		}
	cout << ans << endl;
}

Submission Info

Submission Time
Task F - Painting Graphs with AtCoDeer
User sugim48
Language C++14 (GCC 5.4.1)
Score 1300
Code Size 3694 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 2 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 3 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 3 ms 256 KB
1_039.txt AC 3 ms 256 KB
1_040.txt AC 3 ms 256 KB
1_041.txt AC 3 ms 256 KB
1_042.txt AC 3 ms 256 KB
1_043.txt AC 3 ms 256 KB
1_044.txt AC 2 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 3 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 3 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