考虑计算贡献
#include<bits/stdc++.h>
using namespace std;
vector<int>v[300010];
#define int long long
int res=0;
const int mod=1e9+7;
vector<int>tmp;
int qmi(int a,int b)
{
int res=1;
while(b)
{
if(b&1) res=res*a%mod;
b>>=1;
a=a*a%mod;
}
return res;
}
int n;
int rt;
int tr[300010];
int lowbit(int x)
{
return x&-x;
}
int query(int x)
{
int res=0;
for(int i=x;i;i-=lowbit(i))
{
res+=tr[i];
}
return res;
}
void add(int x,int d)
{
for(int i=x;i<300010;i+=lowbit(i))
{
tr[i]+=d;
}
}
int fact[300010];
int dp[300010];
int dep[300010];
int f[300010];
int sz[300010];
int sum[300010];
void dfs(int u,int fa)
{
f[u]=fa;
dep[u]=dep[fa]+1;
dp[u]=1;
sz[u]=1;
int cnt=0;
int tot=0;
for(auto j:v[u])
{
if(j==fa) continue;
cnt++;
dfs(j,u);
sum[u]++;
tot+=sz[j];
sz[u]+=sz[j];
dp[u] = dp[u] *dp[j]%mod;
}
dp[u]=dp[u]*fact[cnt]%mod;
}
int tot=0;
void dfs2(int u,int fa)
{
add(u,1);
tot+=query(300010-1)-query(u);
int tt=0;
for(auto j:v[u])
{
if(j==fa) continue;
res=(res+dp[rt]*tt*sz[j]%mod*qmi(2,mod-2))%mod;
dfs2(j,u);
tt+=sz[j];
}
add(u,-1);
}
signed main()
{
cin>>n>>rt;
fact[0]=1;
for(int i=1;i<300010;i++)
fact[i]=fact[i-1]*i%mod;
for(int i=0;i<n-1;i++)
{
int a,b;
cin>>a>>b;
v[a].push_back(b);
v[b].push_back(a);
}
dfs(rt,0);
dfs2(rt,0);
res+=tot%mod*dp[rt]%mod;
cout<<res<<endl;
}
|