AtCoder Beginner Contest 160 F.Distributing Integers
题目链接
这题就是树上
d
f
s
dfs
dfs 了,对每个结点
v
v
v,可以递归得到答案,假设与之相连的结点有
n
n
n 个,总数即为
n
!
n!
n!,那么可以递归求出不满足条件的情况
f
[
v
]
f[v]
f[v],那么答案即为
n
!
f
[
v
]
\frac{n!}{f[v]}
f[v]n!,AC代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
const ll mod=1e9+7;
vector<int>g[N];
int n,x,y;
ll power(ll a,ll b){return b?power(a*a%mod,b/2)*(b%2?a:1)%mod:1;}
ll p[N],s[N],f[N];
void dfs(int u){
s[u]=1;
f[u]=1;
for(auto v:g[u]){
if(!s[v]){
dfs(v);
s[u]+=s[v];
p[v]=u;
f[u]=f[u]*f[v]%mod;
}
}
f[u]=f[u]*s[u]%mod;
}
void calculate(int u){
for(auto v:g[u]){
if(v!=p[u]){
f[v]=f[u]*(n-s[v])%mod*power(s[v],mod-2)%mod;
calculate(v);
}
}
}
int main()
{
cin>>n;
for(int i=0;i<n-1;i++){
cin>>x>>y;
g[x].push_back(y);
g[y].push_back(x);
}
ll S=1;
for(int i=1;i<=n;i++) S=S*i%mod;
dfs(1);
calculate(1);
for(int i=1;i<=n;i++)
cout<<S*power(f[i],mod-2)%mod<<endl;
return 0;
}