#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define f first
#define s second
#define pii pair<int32_t,int32_t>
#define ppii pair<int,pii>
#define vi vector<int>
#define pb push_back
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define F(n) for(int i=0;i<n;i++)
#define lb lower_bound
#define ub upper_bound
#define fastio ios::sync_with_stdio(false);cin.tie(NULL);
#pragma GCC optimize ("03,unroll-lopps")
#define sz(x) (int)((x).size())
#define int long long
using namespace std;
const int mod=1e9+7,mxn=1e5,inf=1e18,minf=-1e18,lg=60,Mxn=1e9;
//#undef int
int n,k,m,d,q;
void setIO(string name){
ios_base::sync_with_stdio(0); cin.tie(0);
freopen((name+".in").c_str(),"r",stdin);
freopen((name+".out").c_str(),"w",stdout);
}
int nim[mxn+10],nimu[mxn+10];
int nimr[mxn+10];
//rooted at, cur
vector<int>adj[mxn+10];
int mex(int c[2]){
if(c[0]==0)return 0;
return 1;
}
void dfs(int cur,int p){
int c[2]={0,0};
for(auto i:adj[cur]){
if(i==p)continue;
dfs(i,cur);
c[!!nim[i]]++;
}
nim[cur]=mex(c);
}
void dfs2(int cur,int p){
int c[2]={0,0};
if(p!=-1)c[!!nimu[cur]]++;
for(auto i:adj[cur])if(i!=p)c[!!nim[i]]++;
nimr[cur]=mex(c);
for(auto i:adj[cur])if(i!=p){
c[!!nim[i]]--;
nimu[i]=mex(c);
c[!!nim[i]]++;
}
for(auto i:adj[cur])if(i!=p)dfs2(i,cur);
}
int C[mxn+10],Cu[mxn+10][2],Cr[mxn+10];
void dfs3(int cur,int p){
int x=0;
C[cur]+=(!nim[cur]);
for(auto i:adj[cur])if(i!=p){
dfs3(i,cur);
x+=(!nim[i]);
}
if(x<=1){
for(auto i:adj[cur])if(i!=p&&(nim[cur]^nim[i]))C[cur]+=C[i];
}
}
void dfs4(int cur,int p){
int x=0,sum=0;
if(p!=-1)x+=(!nimu[cur]);
for(auto i:adj[cur])if(i!=p){
x+=(!nim[i]);
Cu[cur][nim[i]]+=C[i];
}
Cr[cur]+=(!nimr[cur]);
if(x<=1)Cr[cur]+=Cu[cur][!nimr[cur]];
for(auto i:adj[cur])if(i!=p){
x-=(!nim[i]);
if(x<=1)Cu[i][x]+=(Cu[cur][!x]-((nim[i]!=x)?C[i]:0))+(!x);
x+=(!nim[i]);
}
for(auto i:adj[cur])if(i!=p)dfs4(i,cur);
}
int cnt=0,D;
int binpow(int ex,int a){
int ans=1;
while(ex){
if(ex&1)ans=(ans*a)%mod;
a=(a*a)%mod;
ex>>=1;
}
return ans;
}
int mul(int a,int b){return (a*b)%mod;}
int add(int a,int b){return (a+b+mod)%mod;}
int dp[2],sum[2];
int get(int ex,int k){
int x=(n*n)%mod,nex=(n*n)%mod,kex=k;
int shift=0,ans=0;
for(int i=0;i<=lg;i++){
if(ex&(1LL<<i)){
ans=mul(ans,kex);
ans=add(ans,mul(x,binpow(2LL*shift,n)));
shift+=(1LL<<i);
}
x=add(mul(x,kex),mul(x,nex));
nex=(nex*nex)%mod;
kex=(kex*kex)%mod;
if(shift==ex)break;
}
return ans;
}
int32_t main(){
fastio
cin>>n>>D;
for(int i=1;i<n;i++){
int a,b;cin>>a>>b;
adj[a].pb(b);
adj[b].pb(a);
}
dfs(1,-1);
dfs2(1,-1);
dfs3(1,-1);
dfs4(1,-1);
for(int i=1;i<=n;i++){
cnt+=nimr[i];
sum[nimr[i]]=add(sum[nimr[i]],Cr[i]);
}
dp[1]=cnt;
dp[0]=n-cnt;
if(D==1){
if(nimr[1])cout<<add(mul(-Cr[1],dp[0]),mul(add(dp[0],dp[1]),n));
else cout<<mul(Cr[1],dp[0]);
return 0;
}
int k2=0;
int k1=add(sum[1],-sum[0]);
k2=get(D-2,k1);
k2=mul(k2,mul(mul(n,add(n,-cnt)),binpow(mod-2,n)));
dp[0]=add(mul(n-cnt,binpow(D-2,k1)),k2);
dp[1]=add(mul(dp[0],add(sum[0],-sum[1])),mul(binpow(2*D-3,n),mul(n,cnt)));
dp[0]=add(mul(dp[0],add(sum[1],-sum[0])),mul(binpow(2*D-3,n),mul(n,add(n,-cnt))));
if(nimr[1])cout<<add(mul(-Cr[1],dp[0]),mul(add(dp[0],dp[1]),n));
else cout<<mul(Cr[1],dp[0]);
}
/*
*/
컴파일 시 표준 에러 (stderr) 메시지
startrek.cpp:16:40: warning: bad option '-funroll-lopps' to pragma 'optimize' [-Wpragmas]
16 | #pragma GCC optimize ("03,unroll-lopps")
| ^
startrek.cpp:23:23: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
23 | void setIO(string name){
| ^
startrek.cpp:33:17: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
33 | int mex(int c[2]){
| ^
startrek.cpp:37:23: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
37 | void dfs(int cur,int p){
| ^
startrek.cpp:46:24: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
46 | void dfs2(int cur,int p){
| ^
startrek.cpp:59:24: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
59 | void dfs3(int cur,int p){
| ^
startrek.cpp:70:24: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
70 | void dfs4(int cur,int p){
| ^
startrek.cpp:87:24: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
87 | int binpow(int ex,int a){
| ^
startrek.cpp:96:20: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
96 | int mul(int a,int b){return (a*b)%mod;}
| ^
startrek.cpp:97:20: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
97 | int add(int a,int b){return (a+b+mod)%mod;}
| ^
startrek.cpp:99:21: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
99 | int get(int ex,int k){
| ^
startrek.cpp:115:14: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
115 | int32_t main(){
| ^
startrek.cpp: In function 'void setIO(std::string)':
startrek.cpp:25:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
25 | freopen((name+".in").c_str(),"r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
startrek.cpp:26:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
26 | freopen((name+".out").c_str(),"w",stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | 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... |