제출 #1288203

#제출 시각아이디문제언어결과실행 시간메모리
1288203IcelastStar Trek (CEOI20_startrek)C++20
45 / 100
102 ms65404 KiB
#include <iostream> #include <bits/stdc++.h> #define ll long long using namespace std; const ll maxn = 1e5+5, INF = 4e18+9, mod = 1e9+7; vector<ll> fact, invfact; ll binpow(ll a, ll b){ ll res = 1; while(b > 0){ if(b&1){ res*=a; res%=mod; } a*=a; a%=mod; b/=2; } return res; } ll modinv(ll x){ return binpow(x, mod-2); } void calcfact(int n){ fact.resize(n+1, 0); invfact.resize(n+1, 0); fact[0] = 1; for(int i = 1; i <= n; i++){ fact[i] = fact[i-1]*i; fact[i]%=mod; } invfact[n] = modinv(fact[n]); for(int i = n-1; i >= 0; i--){ invfact[i] = invfact[i+1]*(i+1)%mod; } } ll nCk(ll n, ll k){ if(k < 0 || k > n) return 0; return fact[n]*(invfact[k]*invfact[n-k]%mod)%mod; } ll distributing_apples(ll n, ll m){ // number of people, apple return nCk(m+n-1, n-1); } void solve(){ ll n, D; cin >> n >> D; vector<vector<int>> adj(n+1); for(int i = 1; i < n; i++){ int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } vector<int> f(n+1), g(n+1); { auto dfs = [&](auto dfs, int u, int p) -> void{ f[u] = 0; g[u] = 0; int onlyv = 0, vv = -1; for(int v : adj[u]){ if(v == p) continue; dfs(dfs, v, u); if(f[v] == 0) f[u] = 1; if(f[v] == 0){ vv = v; onlyv++; } } if(f[u] == 1){ if(onlyv == 1){ for(int v : adj[u]){ if(v == vv){ g[u] += g[v]; } } } }else{ for(int v : adj[u]){ if(f[v] == 1){ g[u] += g[v]; } } g[u]++; } }; dfs(dfs, 1, 0); } { vector<int> t(n+1), tg(n+1); auto dfs = [&](auto dfs, int u, int p) -> void{ t[u] = f[u]; tg[u] = g[u]; int m = adj[u].size(); vector<int> pf(m+1, 0), sf(m+2, 0); vector<int> state(m+1); vector<int> pfg(m+1, 0), sfg(m+2, 0); vector<int> sg(m+1, 0); int it = 0; for(int v : adj[u]){ it++; state[it] = (f[v] == 0); if(f[v] != f[u]) sg[it] = g[v]; } for(int i = 1; i <= m; i++){ pf[i] = pf[i-1] + state[i]; pfg[i] = pfg[i-1] + sg[i]; } for(int i = m; i >= 1; i--){ sf[i] = sf[i+1] + state[i]; sfg[i] = sfg[i+1] + sg[i]; } it = 0; for(int v : adj[u]){ it++; if(v == p) continue; int rb = f[u], rbg = g[u]; f[u] = (pf[it-1] + sf[it+1] > 0); if(f[u] == 1){ if(pf[it-1] + sf[it+1] == 1){ g[u] = pfg[it-1] + sfg[it+1]; }else{ g[u] = 0; } }else{ g[u] = pfg[it-1] + sfg[it+1]; g[u]++; } if((f[v] | (f[u] == 0)) == 1){ if(f[v] == 0 && f[u] == 0){ g[v] += g[u]; }else if(f[v] == 1 && f[u] == 0){ g[v] = 0; } }else{ g[v] += g[u]; } f[v] |= (f[u] == 0); dfs(dfs, v, u); f[u] = rb; g[u] = rbg; } }; dfs(dfs, 1, 0); f = t; g = tg; } ll WC = 0, LC = 0, W = 0, L = 0; for(int i = 1; i <= n; i++){ if(f[i] == 1){ WC += g[i]; W ++; }else{ LC += g[i]; L ++; } } WC %= mod; LC %= mod; ll E = (WC - LC + mod)%mod; ll LD = L * (binpow(n, 2*D) - binpow(E, D) + mod) % mod * modinv((binpow(n, 2*D)%mod + mod - E)%mod) % mod; ll ans; if(f[1] == 0){ ans = LD * g[1] % mod; }else{ ans = binpow(n, 2*D) - LD * g[1] % mod + mod; ans %= mod; } //cout << binpow(4, D) << "\n"; cout << ans; } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); solve(); }
#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...