Submission #1300943

#TimeUsernameProblemLanguageResultExecution timeMemory
1300943Jawad_Akbar_JJŠarenlist (COCI22_sarenlist)C++20
110 / 110
224 ms592 KiB
#include <iostream>
#include <vector>

using namespace std;
const int N = 70, mod = 1e9 + 7;
int hei[N], col[N], c[N], d[N], Par[N], final_Ans;
vector<int> nei[N];

void dfs(int u, int h){
	hei[u] = h;
	for (int i : nei[u]){
		if (i == Par[u])
			continue;
		Par[i] = u;
		dfs(i, h + 1);
	}
}

int main(){
	int n, m, k;
	cin>>n>>m>>k;

	for (int i=1;i<n;i++){
		int a, b;
		cin>>a>>b;
		nei[a].push_back(b);
		nei[b].push_back(a);
	}

	for (int j=0;j<m;j++)
		cin>>c[j]>>d[j];

	dfs(1, 1);

	for (int mask = 0;mask < (1<<m);mask++){
		for (int i=1;i<=n;i++)
			col[i] = 0;

		for (int j=0;j<m;j++){
			if ((1<<j) & mask){
				int u = c[j], v = d[j];
				if (hei[u] > hei[v])
					swap(u, v);
				while (hei[v] > hei[u])
					col[v] |= 1<<j, v = Par[v];
				while (u != v)
					col[v] |= 1<<j, col[u] |= 1<<j, u = Par[u], v = Par[v];
			}
		}

		for (int l=1;l<=5;l++){
			for (int i=1;i<=n;i++){
				for (int j=1;j<=n;j++)
					if (col[i] & col[j])
						col[i] = col[j] = col[i] | col[j];
			}
		}

		int msk = 0, Ans = 1;
		for (int i=2;i<=n;i++){
			if ((msk & col[i]) == 0)
				Ans = 1LL * Ans * k % mod;
			msk |= col[i];
		}

		if (__builtin_popcount(mask) % 2 == 1)
			final_Ans = (final_Ans - Ans + mod) % mod;
		else
			final_Ans = (final_Ans + Ans) % mod;
	}
	cout<<final_Ans<<'\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...