#include<bits/stdc++.h> using namespace std; #define LL long long #define N 5005 #define INF 0x3f3f3f3f3f3f3f3fLL const LL mod=1000000007; LL n,m,x,y,ans,c,tot,sum,a[N],sz[N],mx[N],head[N],fac[N],ifac[N],f[N][N]; struct edge{LL v,nxt;}e[N*2]; void add(LL x,LL y){e[++tot].v=y; e[tot].nxt=head[x]; head[x]=tot;} void dfs(LL u,LL fa){ sz[u]=1; mx[u]=0; for (LL i=head[u],v;i;i=e[i].nxt) if ((v=e[i].v)!=fa){ dfs(v,u); sz[u]+=sz[v]; mx[u]=max(mx[u],sz[v]); } mx[u]=max(mx[u],n-sz[u]); if (mx[u]<mx[c]) c=u; } void getsz(LL u,LL fa){ sz[u]=1; for (LL i=head[u],v;i;i=e[i].nxt) if ((v=e[i].v)!=fa){ dfs(v,u); sz[u]+=sz[v]; } } LL inv(LL x){return x==1?1:(mod-mod/x)*inv(mod%x)%mod;} LL C(LL x,LL y){return fac[x]*ifac[y]%mod*ifac[x-y]%mod;} LL P(LL x,LL y){return fac[x]*ifac[x-y]%mod;} int main(){ scanf("%lld",&n); for (LL i=1;i<n;i++){ scanf("%lld%lld",&x,&y); add(x,y); add(y,x); } mx[c=0]=INF; dfs(1,0); for (LL i=1;i<=n;i++) if (i!=c && mx[i]==mx[c]){ ans=1; for (LL i=1;i<=n/2;i++) (ans*=i)%=mod; printf("%lld\n",ans*ans%mod); return 0; } getsz(c,0); for (LL i=head[c];i;i=e[i].nxt) a[++m]=sz[e[i].v]; fac[0]=1; for (LL i=1;i<=n;i++) fac[i]=fac[i-1]*i%mod; ifac[n]=inv(fac[n]); for (LL i=n-1;i>=0;i--) ifac[i]=ifac[i+1]*(i+1)%mod; sum=0; f[0][0]=1; for (LL i=1;i<=m;i++){ sum+=a[i]; for (LL j=0;j<=sum;j++) for (LL k=0;k<=a[i] && k<=j;k++) (f[i][j]+=f[i-1][j-k]*C(a[i],k)%mod*P(a[i],k)%mod)%=mod; } for (LL i=0;i<=n;i++) (ans+=f[m][i]*fac[n-i]%mod*(i&1?-1:1)+mod)%=mod; printf("%lld\n",ans); return 0; }
|