#include <bits/stdc++.h>
typedef long long ll;
#define FOR(i,a,b) for(int i=(a);i<(b);i++)
#define REP(i,a) FOR(i,0,a)

using namespace std;
typedef vector<ll> vec;
const int MAX_N=2000;
int N;
const ll MOD=1e9+7;
vector<int> G[MAX_N];
vec dp[MAX_N][3];
ll minv2;
ll mpw(ll n,ll m){
	ll ret=1;
	while(m){
		if(m&1){
			ret*=n;
			ret%=MOD;
		}
		n*=n;
		n%=MOD;
		m>>=1;
	}
	return ret;
}
void add(ll &a,ll b){
	a+=b;
	if(a>=MOD){
		a-=MOD;
	}
}
void dfs(int v,int p){
	REP(i,3){
		int a=0;
		if(i==0)a=1;
		dp[v][i].push_back(a);
	}
	for(auto e:G[v]){
		if(e!=p){
			dfs(e,v);
			int n=(int)dp[v][0].size(),m=(int)dp[e][0].size();
			vec tmp[3];
			REP(i,3){
				tmp[i].resize(n+m);
			}
			REP(i,n){
				REP(d1,3){
					REP(j,m){
						REP(d2,3){
							int c2,d3;
							c2=i+j+1;
							d3=d1;
							add(tmp[d3][c2],dp[v][d1][i]*dp[e][d2][j]%MOD);
							if(d1==2 || d2==2)continue;
							d3=d1+1;
							ll x;
							c2--;
							if(d1==0 && d2==0){
								x=2;
							}else if(d1==0 || d2==0){
								x=1;
							}else{
								x=minv2;
							}
							add(tmp[d3][c2],dp[v][d1][i]*dp[e][d2][j]%MOD*x%MOD);
						}
					}
				}
			}
			REP(i,3){
				dp[v][i]=tmp[i];
			}
		}
	}
}
			
int main(){
	minv2=mpw(2,MOD-2);
	cin>>N;
	REP(i,N-1){
		int b;
		cin>>b;
		b--;
		G[i+1].push_back(b);
		G[b].push_back(i+1);
	}
	dfs(0,-1);
	ll ans=0,x=1,sgn=1;
	REP(i,N-1)sgn*=-1;
	REP(i,N){
		x*=(i+1);
		x%=MOD;
		REP(j,3){
			add(ans,(sgn*(dp[0][j][i]*x)%MOD+MOD)%MOD);
		}
		sgn*=-1;
	}
	cout<<ans<<endl;
}