#include<bits/stdc++.h>
using namespace std;
const int f = 1e5+10;
const long long mod = 1e9+7;
vector<int> g[f];
long long dp[f];
long long ways[f];
bool B[f];
bool F[f];
pair<long long,long long> dpI[f];
pair<long long,long long> dpI0[f];
struct matric{
	long long id[5][5];
	matric(){
		for(int i =0;i<5;i++){
			for(int j =0;j<5;j++){
				id[i][j] =0;
			}
		}
	}
};
long long powmod(long long a,long long p){
	long long ans = 1;
	while(p>0){
		if(p&1)ans = ans*a%mod;
		p/=2;a = a*a%mod;
	}
	return ans;
}
matric makemat(long long x,long long n){
	matric a;
	a.id[0][0] = (x+mod)%mod;
	a.id[1][0] = 1;
	a.id[0][1] = 0;
	a.id[1][1] = powmod(n,2);
	return a;
}
matric zarb(matric a,matric b){
	matric ans;
	for(int i =0;i<2;i++){
		for(int j =0;j<2;j++){
			ans.id[i][j] = 0;
			for(int h =0;h<2;h++){
				ans.id[i][j]+=(a.id[i][h]*b.id[h][j])%mod;
				ans.id[i][j]%=mod;
			}
		}
	}
	return ans;
}
matric powmat(matric a,long long p){
	matric ans = a;p--;
	while(p>0){
		if(p&1LL)ans = zarb(ans,a);
		p/=2LL;a = zarb(a,a);
	}
	return ans;
}
int dfs(int v,int par){
	int cnt =0;
	int much =0;
	int meny = 0;
	for(int u:g[v]){
		if(u==par)continue;
		cnt+=dfs(u,v);
		much+=!B[u];
	}
	if(much==0){
		B[v] = 0;
		for(int u:g[v]){
			if(u==par)continue;
			meny+=dp[u];
		}
		dp[v] = meny;
		// cout<<v<<'\n';
	}
	else if (much==1){
		B[v] = 1;
		for(int u:g[v]){
			if(u==par)continue;
			if(!B[u])meny+=dp[u];
		}
		dp[v] = meny;
	}
	else{
		B[v] = 1;
		dp[v] = 0;
	}
	cnt+=!B[v];
	dp[v]+=!B[v];
	ways[v] = much;
	return cnt;
}
int dfs2(int v,int par){
	int cnt =0 ;
	if(v!=1){
		if(!F[par]&&ways[par]-!B[v]==0)F[v] =1;
		else F[v] = 0;
	}
	else{
		F[1] = 0;
	}
	cnt = !(B[v]||F[v]);
	for(int u:g[v]){
		if(u==par)continue;
		cnt+=dfs2(u,v);
	}
	return cnt;
}
void dfsH1(int v,int par){
	dpI[v] = {0,0};
	for(int u:g[v]){
		if(u==par)continue;
		dfsH1(u,v);
		if(ways[v]+(F[v])-!B[u]==0){
			dpI[v].first+=dpI[u].second;
		}
		else if(ways[v]+(F[v])-!B[u]==1){
			dpI[v].second+=dpI[u].first;
		}
	}
	dpI[v].second+=(ways[v]+F[v]==1);
	// cout<<v<<" "<<dpI[v].first<<'\n';
}
void dfsH2(int v,int par){
	dpI0[v] = {0,0};
	if(par==1){
		if(B[v]==0){
			dpI0[v].first+=dpI[par].second;
			if(ways[par]+(F[par])-!B[v]==1){
				dpI0[v].first-=dpI[v].first;
			}
		}
		else if(ways[v]==1){
			dpI0[v].second+=dpI[par].first;
			if(ways[par]+(F[par])-!B[v]==0){
				dpI0[v].second-=dpI[v].second;
			}
			// cout<<"?";
		}
	}
	else if(par!=0){
		if(B[v]==0){
			dpI0[v].first+=dpI0[par].second;
		}
		else if(ways[v]==1){
			dpI0[v].second+=dpI0[par].first;
		}
	}
	dpI0[v].second+=(ways[v]+F[v]==1);
	// cout<<v<<" "<<dpI0[v].first<<" "<<dpI0[v].second<<'\n';
	for(int u:g[v]){
		if(u==par)continue;
		dfsH2(u,v);
	}
}
void dfsI1(int v,int par){
	dpI[v] = {0,0};
	for(int u:g[v]){
		if(u==par)continue;
		dfsI1(u,v);
		if(ways[v]+(F[v])-!B[u]==0){
			dpI[v].first+=dpI[u].second;
		}
		else if(ways[v]+(F[v])-!B[u]==1){
			dpI[v].second+=dpI[u].first;
		}
	}
	dpI[v].first+=(ways[v]+F[v]==0);
	// cout<<v<<" "<<dpI[v].first<<'\n';
}
void dfsI2(int v,int par){
	dpI0[v] = {0,0};
	if(par==1){
		if(B[v]==0){
			dpI0[v].first+=dpI[par].second;
			if(ways[par]+(F[par])-!B[v]==1){
				dpI0[v].first-=dpI[v].first;
			}
		}
		else if(ways[v]==1){
			dpI0[v].second+=dpI[par].first;
			if(ways[par]+(F[par])-!B[v]==0){
				dpI0[v].second-=dpI[v].second;
			}
			// cout<<"?";
		}
	}
	else if(par!=0){
		if(B[v]==0){
			dpI0[v].first+=dpI0[par].second;
		}
		else if(ways[v]==1){
			dpI0[v].second+=dpI0[par].first;
		}
	}
	dpI[v].first+=(ways[v]+F[v]==0);
	// cout<<v<<" "<<dpI0[v].first<<" "<<dpI0[v].second<<'\n';
	for(int u:g[v]){
		if(u==par)continue;
		dfsI2(u,v);
	}
}
int main(){
	long long n,d;cin>>n>>d;
	for(int i =0;i<n-1;i++){
		int l,r;cin>>l>>r;
		g[l].push_back(r);
		g[r].push_back(l);
	}
	long long mI =0,mH = 0,I =0,hI =0;
	// for(int i =n;i>=1;i--){
		// dfs(i,0);
		// if(B[i]){
			// mH+=dp[i];
		// }
		// else {
			// mI+=dp[i];
		// }
		// // cout<<mI<<" "<<mH<<'\n';
		// // mI%=mod;mH%=mod;
	// }
	// cout<<hI<<" "<<dfs(1,0)<<'\n';
	// cout<<I <<" "<< dfs2(1,0)<<'\n';
	hI = dfs(1,0);
	I = dfs2(1,0);
	dfsH1(1,0);
	dfsH2(1,0);
	long long myans =0;
	for(int i =1;i<=n;i++){
		myans+=dpI[i].first+dpI0[i].first;
		// cout<<i<<" "<<dpI[i].first<<" "<<dpI0[i].first<<'\n';
	}
	dfsI1(1,0);
	dfsI2(1,0);
	myans =0;
	for(int i =1;i<=n;i++){
		myans+=dpI[i].first+dpI0[i].first;
		// cout<<i<<" "<<dpI[i].first<<" "<<dpI0[i].first<<'\n';
	}
	myans-=I;
	// cout<<mH<<" "<<myans<<'\n';
	mI = myans;
	matric base;
	base.id[0][0] = I;
	base.id[0][1] =  (I*n%mod)*n%mod;
	base.id[1][0] = base.id[1][1] = 0;
	long long gI,fI;
	if(d>1){
		matric mp = powmat(makemat(mH-mI,n),d-1);
		base = zarb(base,mp);
	}
	gI = base.id[0][0];
	if(!B[1]){
		cout<<gI*dp[1]%mod;
	}
	else cout<<((powmod(n,2*d)-gI*dp[1])%mod+mod)%mod;
	// cout<<'\n'<<gI<<" "<<fI<<" "<<hI<<" "<<dp[1];
}
| # | 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... |