Submission #1340645

#TimeUsernameProblemLanguageResultExecution timeMemory
1340645nguyenkhangninh99Star Trek (CEOI20_startrek)C++20
7 / 100
1 ms580 KiB

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

#define int long long
const int maxn = 1e5 + 5, mod = 1e9 + 7;

vector<int> adj[maxn];
int state1[maxn], c1[maxn]; 
int cntl[maxn], sumc[maxn], sumcl[maxn];
int state[maxn], c[maxn];

int binpow(int a, int b){
    int res = 1;
    while(b){
        if(b & 1) res = res * a % mod;
        a = a * a % mod;
        b /= 2;
    }
    return res;
}

void dfs1(int u, int p){
    for(int v: adj[u]){
        if(v == p) continue;
        dfs1(v, u);
        sumc[u] += c1[v];
        if(state1[v] == 0){
            cntl[u]++;
            sumcl[u] += c1[v];
        }
    }
    if(cntl[u] == 0){
        state1[u] = 0; 
        c1[u] = sumc[u] + 1; //
    }else{
        state1[u] = 1;
        c1[u] = (cntl[u] == 1) ? sumcl[u] : 0;
    }
}

void dfs2(int u, int p, int pstate, int pcnt){
    int totl = cntl[u] + (pstate == 0);
    int tot = sumc[u] + pcnt;

    if(totl == 0){
        state[u] = 0;
        c[u] = tot + 1;
    }else{
        state[u] = 1;
        if(totl == 1) c[u] = (pstate == 0) ? pcnt : sumcl[u];
        else c[u] = 0;
    }
    for(int v: adj[u]) {
        if(v == p) continue;

        int out = totl - (state1[v] == 0);
        if(out == 0) dfs2(v, u, 0, 1 + tot - c1[v]);
        else{
            int ncnt;
            if(out == 1){
                if(pstate == 0) ncnt = pcnt;
                else ncnt = sumcl[u] - ((state1[v] == 0) ? c1[v] : 0);
            }else ncnt = 0;
            dfs2(v, u, 1, ncnt);
        }
    }
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    int n, d; cin >> n >> d;
    if(n == 2){
        cout << binpow(4, d);
        return 0;
    }
    for(int i = 1; i <= n - 1; i++){
        int u, v; cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }

    dfs1(1, 0);
    dfs2(1, 0, 1, 0); 

    int cnt = 0, sumw = 0, suml = 0;
    for(int i = 1; i <= n; i++){
        if(state[i] == 0){
            cnt++;
            suml = (suml + c[i]) % mod;
        }else sumw = (sumw + c[i]) % mod;
        
    }
    int delta = (sumw - suml + mod) % mod, e = cnt, s = 1;      
    for(int i = 1; i <= d - 1; i++){
        s = s * n % mod * n % mod;
        e = (cnt * s + e * delta) % mod; 
    }
    int ways = (c[1] * e) % mod;

    int ans = 0;
    if(state[1] == 0) ans = ways;
    else ans = (s - ways + mod) % mod;
    cout << ans;
}



    
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...