#include <bits/stdc++.h>
#define gibon ios::sync_with_stdio(false); cin.tie(0);
#define fir first
#define sec second
#define pdd pair<long double, long double>
#define pii pair<int, int>
#define pll pair<ll, ll>
#define ld long double
#define pmax pair<__int128, __int128>
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
typedef long long ll;
using namespace std;
int dx[4]= {0, 1, 0, -1}, dy[4]= {1, 0, -1, 0};
int ddx[8]={1, 1, 0, -1, -1, -1, 0, 1}, ddy[8]={0, 1, 1, 1, 0, -1, -1, -1};
const int mxN=100025;
const int mxM=300005;
const int mxK=1000000000;
const ll MOD=1000'000'007;
const ll INF=1000000000000000005;
ll N, D;
vector <int> v[mxN];
int outw[mxN];
int downw[mxN], upw[mxN];
bool W[mxN];
ll degL[mxN];
vector <int> v2[mxN];
ll leafw2[mxN], sizl2[mxN], par2[mxN];
ll numw;
int match[mxN];
ll swapL1[mxN];
void dfs_downw(int now, int pre)
{
for(int nxt : v[now]) if(nxt!=pre)
{
dfs_downw(nxt, now);
}
downw[now]=(outw[now]==0 ? 1 : 0);
if(now!=1) outw[pre]+=downw[now];
}
void dfs_upw(int now, int pre)
{
if(now!=1)
{
upw[now]=(outw[pre]-downw[now]==0 ? 1 : 0);
outw[now]+=upw[now];
}
for(int nxt : v[now]) if(nxt!=pre)
{
dfs_upw(nxt, now);
}
}
int findpar(int a)
{
return (par2[a]==a ? a : par2[a]=findpar(par2[a]));
}
void onion(int a, int b)
{
int p=findpar(a), q=findpar(b);
par2[p]=q; sizl2[q]+=sizl2[p]; leafw2[q]+=leafw2[p];
}
int dfs_match(int now, int pre)
{
for(int nxt : v[now]) if(nxt!=pre && W[nxt] && degL[nxt]==0)
{
int tmp=dfs_match(nxt, now);
if(tmp!=0) match[now]=tmp, match[tmp]=now;
}
if(match[now]) return 0;
else return now;
}
int dfs_1(int now)
{
int sum=1;
for(int nxt : v[match[now]]) if(nxt!=now && degL[nxt]==0)
{
sum+=dfs_1(nxt);
}
return sum;
}
int dfs_swap(int now)
{
if(swapL1[now]!=0) return swapL1[now];
ll sum=1;
for(int nxt : v[match[now]]) if(nxt!=now && W[nxt] && degL[nxt]==0)
{
sum+=dfs_swap(nxt);
}
return swapL1[now]=sum;
}
ll f(ll a)
{
return (a%MOD+MOD)%MOD;
}
int main()
{
gibon
cin >> N >> D;
for(int i=1;i<N;i++)
{
int a, b; cin >> a >> b;
v[a].push_back(b);
v[b].push_back(a);
}
dfs_downw(1, -1);
dfs_upw(1, -1);
for(int i=1;i<=N;i++)
{
W[i]=(outw[i]>=1);
numw+=W[i];
}
for(int i=1;i<=N;i++)
{
for(int ele : v[i])
{
if(!W[ele]) degL[i]++;
}
}
for(int i=1;i<=N;i++)
{
if(!W[i])
{
for(int ele : v[i]) if(degL[ele]<3) v2[i].push_back(ele);
}
else if(degL[i]<3)
{
for(int ele : v[i]) if(!W[ele]) v2[i].push_back(ele);
}
}
for(int i=1;i<=N;i++)
{
par2[i]=i;
if(v2[i].size()==1 && W[i]) leafw2[i]=1;
if(!W[i]) sizl2[i]=1;
}
for(int i=1;i<=N;i++)
{
for(int ele : v2[i]) if(ele<i)
{
onion(ele, i);
}
}
dfs_match(1, -1);
for(int i=1;i<=N;i++) if(W[i] && degL[i]==0) dfs_swap(i);
ll k1=numw, k2=0;
for(int i=1;i<=N;i++) k2+=swapL1[i];
k2%=MOD;
for(int i=1;i<=N;i++) if(findpar(i)==i) k2+=sizl2[i]*(sizl2[i]-leafw2[i]), k2%=MOD;
ll recur=numw;
ll powN=N;
for(int i=1;i<=D-1;i++)
{
recur=k1*powN%MOD*N%MOD-k2*powN%MOD+k2*recur%MOD;
recur=(recur%MOD+MOD)%MOD;
powN=powN*N%MOD*N%MOD;
}
if(W[1])
{
ll ans=powN*N%MOD;
if(degL[1]==0) ans-=(powN-recur)*dfs_1(1); ans=f(ans);
if(v2[1].size()==1) ans-=(powN-recur)*sizl2[findpar(1)]; ans=f(ans);
cout << ans;
}
else
{
ll ans=0;
ans+=(powN-recur)*sizl2[findpar(1)];
cout << f(ans);
}
}
/*
15 1
11 10
2 1
13 3
14 2
1 3
9 10
6 7
9 4
1 6
3 12
8 11
0 14
5 13
12 9
*/
Compilation message
startrek.cpp: In function 'int main()':
startrek.cpp:161:9: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
161 | if(degL[1]==0) ans-=(powN-recur)*dfs_1(1); ans=f(ans);
| ^~
startrek.cpp:161:53: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
161 | if(degL[1]==0) ans-=(powN-recur)*dfs_1(1); ans=f(ans);
| ^~~
startrek.cpp:162:9: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
162 | if(v2[1].size()==1) ans-=(powN-recur)*sizl2[findpar(1)]; ans=f(ans);
| ^~
startrek.cpp:162:66: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
162 | if(v2[1].size()==1) ans-=(powN-recur)*sizl2[findpar(1)]; ans=f(ans);
| ^~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
4948 KB |
Output is correct |
2 |
Incorrect |
4 ms |
5076 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
4948 KB |
Output is correct |
2 |
Correct |
3 ms |
4948 KB |
Output is correct |
3 |
Execution timed out |
1084 ms |
4948 KB |
Time limit exceeded |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
4948 KB |
Output is correct |
2 |
Correct |
3 ms |
5076 KB |
Output is correct |
3 |
Correct |
3 ms |
4948 KB |
Output is correct |
4 |
Correct |
3 ms |
5076 KB |
Output is correct |
5 |
Correct |
3 ms |
5076 KB |
Output is correct |
6 |
Correct |
3 ms |
5076 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
4948 KB |
Output is correct |
2 |
Correct |
3 ms |
5076 KB |
Output is correct |
3 |
Correct |
3 ms |
4948 KB |
Output is correct |
4 |
Correct |
3 ms |
5076 KB |
Output is correct |
5 |
Correct |
3 ms |
5076 KB |
Output is correct |
6 |
Correct |
3 ms |
5076 KB |
Output is correct |
7 |
Correct |
4 ms |
5168 KB |
Output is correct |
8 |
Correct |
4 ms |
5076 KB |
Output is correct |
9 |
Correct |
3 ms |
5160 KB |
Output is correct |
10 |
Correct |
3 ms |
5076 KB |
Output is correct |
11 |
Correct |
3 ms |
5076 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
4948 KB |
Output is correct |
2 |
Correct |
3 ms |
5076 KB |
Output is correct |
3 |
Correct |
3 ms |
4948 KB |
Output is correct |
4 |
Correct |
3 ms |
5076 KB |
Output is correct |
5 |
Correct |
3 ms |
5076 KB |
Output is correct |
6 |
Correct |
3 ms |
5076 KB |
Output is correct |
7 |
Correct |
4 ms |
5168 KB |
Output is correct |
8 |
Correct |
4 ms |
5076 KB |
Output is correct |
9 |
Correct |
3 ms |
5160 KB |
Output is correct |
10 |
Correct |
3 ms |
5076 KB |
Output is correct |
11 |
Correct |
3 ms |
5076 KB |
Output is correct |
12 |
Correct |
89 ms |
15948 KB |
Output is correct |
13 |
Correct |
101 ms |
15680 KB |
Output is correct |
14 |
Correct |
59 ms |
16324 KB |
Output is correct |
15 |
Correct |
111 ms |
14200 KB |
Output is correct |
16 |
Correct |
99 ms |
15684 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
4948 KB |
Output is correct |
2 |
Correct |
3 ms |
5076 KB |
Output is correct |
3 |
Correct |
3 ms |
4948 KB |
Output is correct |
4 |
Correct |
3 ms |
5076 KB |
Output is correct |
5 |
Correct |
3 ms |
5076 KB |
Output is correct |
6 |
Correct |
3 ms |
5076 KB |
Output is correct |
7 |
Correct |
4 ms |
5168 KB |
Output is correct |
8 |
Correct |
4 ms |
5076 KB |
Output is correct |
9 |
Correct |
3 ms |
5160 KB |
Output is correct |
10 |
Correct |
3 ms |
5076 KB |
Output is correct |
11 |
Correct |
3 ms |
5076 KB |
Output is correct |
12 |
Correct |
3 ms |
4948 KB |
Output is correct |
13 |
Incorrect |
4 ms |
5164 KB |
Output isn't correct |
14 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
4948 KB |
Output is correct |
2 |
Correct |
3 ms |
5076 KB |
Output is correct |
3 |
Correct |
3 ms |
4948 KB |
Output is correct |
4 |
Correct |
3 ms |
5076 KB |
Output is correct |
5 |
Correct |
3 ms |
5076 KB |
Output is correct |
6 |
Correct |
3 ms |
5076 KB |
Output is correct |
7 |
Correct |
4 ms |
5168 KB |
Output is correct |
8 |
Correct |
4 ms |
5076 KB |
Output is correct |
9 |
Correct |
3 ms |
5160 KB |
Output is correct |
10 |
Correct |
3 ms |
5076 KB |
Output is correct |
11 |
Correct |
3 ms |
5076 KB |
Output is correct |
12 |
Correct |
89 ms |
15948 KB |
Output is correct |
13 |
Correct |
101 ms |
15680 KB |
Output is correct |
14 |
Correct |
59 ms |
16324 KB |
Output is correct |
15 |
Correct |
111 ms |
14200 KB |
Output is correct |
16 |
Correct |
99 ms |
15684 KB |
Output is correct |
17 |
Correct |
3 ms |
4948 KB |
Output is correct |
18 |
Incorrect |
4 ms |
5164 KB |
Output isn't correct |
19 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
4948 KB |
Output is correct |
2 |
Incorrect |
4 ms |
5076 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |