#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);
}
for(int i = 0;i < n;++i)
{
dfs_dp(i,-1);
fdp[i] = dp[i];
}
//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 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |