Submission #1155854

#TimeUsernameProblemLanguageResultExecution timeMemory
1155854ace5Star Trek (CEOI20_startrek)C++20
38 / 100
85 ms32840 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 100005; const int mod = int(1e9)+7; ll binpow(ll a,ll b) { return (b == 0 ? 1 : (b%2 == 0 ? binpow((a*a)%mod,b/2) : (a*binpow(a,b-1))%mod)); } ll del(ll a,ll b) { return (a*binpow(b,mod-2))%mod; } ll get_ans(ll wt,ll lt,ll qwt,ll qlt,ll D,ll cw,ll w0,ll tl0,ll tw0,ll n) { /* ll fl = (n*n)%mod; ll ans = 0; ans = (ans + w0 * binpow(n,2*D-1))%mod; //1... ans = (ans + ((cw * t0)%mod) * binpow(qt,D-1))%mod; //?...?1 if(qt == fl) { ans = (ans + ((D%mod) * binpow(fl,D-1))%mod * wt)%mod; //???1... } else { ll dl = del(qt,fl); ll sum = (binpow(fl,D)*del((binpow(dl,D)-1+mod)%mod,(dl-1+mod)%mod))%mod; ans = (ans + sum * wt)%mod; //???1... }*/ ll dp[2][D+1]; for(int i = D;i > 0;--i) { if(i == D) { dp[0][i] = cw; dp[1][i] = n-cw; } else { dp[0][i] = (wt + qwt * dp[0][i+1] + qlt * dp[1][i+1])%mod; dp[1][i] = (lt + qwt * dp[1][i+1] + qlt * dp[0][i+1])%mod; } } return (w0 * binpow(n,2*D-1) + (tl0 * dp[1][1]) + (tw0 * dp[0][1]))%mod; } vector<int> g[maxn]; bool w[maxn]; int cnt[maxn]; int sz[maxn]; pair<bool,int> dp[maxn]; pair<bool,int> fdp[maxn]; int n; void dfs_dp(int v,int p) { sz[v] = 1; vector<int> lv; for(auto u:g[v]) { if(u != p) { dfs_dp(u,v); sz[v] +=sz[u]; if(!dp[u].first) lv.push_back(u); } } int cn = 0; for(auto u:g[v]) { if(u != p) { if(lv.size() >= 2) { cn += sz[u]; } else if(lv.size() == 1) { if(u == lv[0]) cn += dp[u].second; else cn += sz[u]; } else cn += dp[u].second; } } dp[v] = {lv.size(),cn + !!(lv.size())}; return ; } void dfs_fdp(int v,int p,pair<bool,int> pdp) { //cout << v << ' ' << pdp.first << ' ' << pdp.second << "\n"; vector<int> lv; int sum_cnt = 0; for(auto u:g[v]) { if(u != p) { sum_cnt += dp[u].second; if(!dp[u].first) { lv.push_back(u); } } } if(p != -1) { sum_cnt += pdp.second; if(!pdp.first) { lv.push_back(p); } } fdp[v].first = lv.size(); if(fdp[v].first) { if(lv.size() == 1) fdp[v].second = (lv[0] == p ? sz[v] + pdp.second : n - sz[lv[0]] + dp[lv[0]].second); else fdp[v].second = n; } else fdp[v].second = sum_cnt; if(lv.size() == 0) { for(auto u:g[v]) { if(u != p) { dfs_fdp(u,v,{0,sum_cnt - dp[u].second}); } } } else if(lv.size() == 1) { if(lv[0] == p) { for(auto u:g[v]) { if(u != p) { dfs_fdp(u,v,{1,sz[v] - sz[u] + pdp.second}); } } } else { for(auto u:g[v]) { if(u != p) { if(u != lv[0]) dfs_fdp(u,v,{1,fdp[v].second - sz[u]}); else dfs_fdp(u,v,{0,sum_cnt - dp[u].second}); } } } } else if(lv.size() == 2) { for(auto u:g[v]) { if(u != p) { if(u != lv[0] && u != lv[1]) dfs_fdp(u,v,{1,n-sz[u]}); else if(u == lv[0]) { dfs_fdp(u,v,{1,lv[1] == p ? sz[v] - sz[u] + pdp.second : n - sz[lv[1]] - sz[u] + dp[lv[1]].second}); } else { dfs_fdp(u,v,{1,lv[0] == p ? sz[v] - sz[u] + pdp.second : n - sz[lv[0]] - sz[u] + dp[lv[0]].second}); } } } } else { for(auto u:g[v]) { if(u != p) { dfs_fdp(u,v,{1,n-sz[u]}); } } } } int main() { ios_base::sync_with_stdio(false); cin.tie(0); ll D; cin >> n >> D; for(int i = 0;i < n-1;++i) { int u,v; cin >> u >> v; u--; v--; g[u].push_back(v); g[v].push_back(u); } dfs_dp(0,-1); dfs_fdp(0,-1,{0,0}); ll wt = 0,lt = 0,qwt = 0,qlt = 0,cw = 0,w0 = 0,tl0 = 0,tw0 = 0; if(fdp[0].first) { w0 = fdp[0].second; tw0 = n-fdp[0].second; } else tl0 = n-fdp[0].second; // cout << dp[0].second << ' '; for(int j =0;j < n;++j) { // cout << fdp[j].first << ' ' << fdp[j].second << "\n"; wt = (wt+(fdp[j].first ? fdp[j].second : 0))%mod; lt = (lt+(fdp[j].first ? 0 : fdp[j].second))%mod; if(fdp[j].first) qwt = (qwt+n - fdp[j].second)%mod; else qlt = (qlt+n - fdp[j].second)%mod; cw += (fdp[j].first); } // cout << wt << ' ' << lt << ' ' << qwt << ' ' << qlt << ' ' << cw << ' ' << w0 << ' ' << tl0 << ' ' << tw0 << "\n"; cout << get_ans(wt,lt,qwt,qlt,D,cw,w0,tl0,tw0,n) << "\n"; return 0; }
#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...