#include<bits/stdc++.h>
using namespace std;
#define int long long
#define Z int
#define i128 int128
#define ii pair<int,int>
#define ld long double
#define vi vector<int>
#define vvi vector<vi>
#define vii vector<pair<int,int>>
#define FOR(i,a,b) for (int i=a;i<=b;i++)
#define FOR1(i,a,b,c) for (int i=a;i<=b;i+=c)
#define REP(i,a,b) for (int i=a;i>=b;i--)
#define REP1(i,a,b,c) for(int i=b;i>=a;i-=c)
#define endh '\n';
#define len(a) ((Z)(a).size())
#define pb(c) push_back(c)
#define elif else if
#define ppb() pop_back()
#define rong std::npos
#define all(c) (c.begin(),c.end())
#define Z int
#define R double
#define lcm(a,b) ((int) (a/__gcd(a,b))*b)
#define mk(a,b) make_pair(a,b)
#define fi first
#define se second
Z dx4[]= {-1,1,0,0};
Z dy4[]= {0,0,1,-1};
string co="YES",khong="NO";
const int mod=1e9+7;
const string NAME = "coloring";
vi g[77], g1[77];
Z par[77];
vi path[20];
Z n , m, k ;
Z idx[77][77];
bool check[77];
Z mu(Z num ,Z x )
{
    Z ans = 1;
    FOR(i, 1, x) ans = ans * num % mod;
    return ans;
}
Z h[77];
void get(Z u, Z v , vi & tam)
{
    if (h[u] > h[v]) swap(u,v);
    vi lt;
    while( h[v] > h[u]) {
        tam.pb(v);
        v = par[v];
    }
    while ( u  == v) {
         vi cc;
         cc.pb(u);
        FOR(i, 0, len(tam)- 2 ) cc.pb(idx[tam[i]][tam[i + 1]]);
        tam = cc;
        return ;
    }
    while(u != v){
        lt.pb(u);
        tam.pb(v);
        u = par[u];
        v = par [v];
    }
    tam.pb(u);
    REP(i, len(lt) - 1, 0) tam.pb(lt[i]);
    vi cc;
    FOR(i, 0, len(tam)- 2 ) cc.pb(idx[tam[i]][tam[i + 1]]);
    tam = cc;
}
void dfs(Z u, Z p  = - 1)
{
    for (Z v : g[u]){
        if (v == p) continue;
        h[v] = h[u] + 1;
        par[v] = u;
        dfs(v, u);
    }
}
void dfs1(Z u, Z p = - 1)
{
    check[u] = 1;
    for (Z v : g1[u]){
        if (check[v]) continue;
        dfs1(v, u);
    }
}
signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
   // freopen((NAME + ".inp").c_str(),"r", stdin);
  //  freopen((NAME + ".out").c_str(),"w", stdout);
    cin >> n >> m >> k;
    FOR(i, 1, n - 1 ){
        Z u, v;
        cin >> u >> v;
        idx[u][v] = idx[v][u] = i;
        g[u].pb(v);
        g[v].pb(u);
    }
    h[1] = 1;
    dfs(1);
    FOR(i, 0, m - 1){
        Z u, v;
        cin >> u >> v;
        get(u,v, path[i]);
    }
    Z sol  = mu(k, n - 1);
//    FOR(i, 0, m- 1){
//        for (Z v : path[i]) cout << v <<" ";
//        cout << '\n';
//    }
//
//    cout << sol << '\n';
    FOR(mask, 1, (1 << m) - 1){
        memset(check,0,sizeof(check));
        FOR(i, 1, n) g1[i].clear();
        FOR(i, 0, m - 1){
            if (mask >> i & 1){
                FOR(j, 0 , len(path[i]) - 2){
                    g1[path[i][j]].pb(path[i][j + 1]);
                    g1[path[i][j + 1]].pb(path[i][j]);
                }
            }
        }
        Z cnt = 0;
        FOR(i, 1, n - 1){
            if (!check[i]){
                ++ cnt;
                dfs1(i);
            }
        }
//        cout << mask << " " << cnt << '\n';
        if (__builtin_popcount(mask) % 2 == 0){
            sol = (sol + mu(k, cnt)) % mod;
        }
        else sol = (sol - mu(k, cnt) + mod) % mod;
    }
    cout << sol << '\n';
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |