#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define fbo find_by_order
#define ook order_of_key

typedef long long ll;
typedef pair<int,pair<int,int> > ii;
typedef vector<int> vi;
typedef long double ld; 
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> pbds;
typedef set<int>::iterator sit;
typedef map<int,int>::iterator mit;
typedef vector<int>::iterator vit;

const int MOD = 1e9 + 7;
int add(int a, int b)
{
	a+=b;
	while(a>=MOD) a-=MOD;
	return a;
}
int mult(int a, int b)
{
	return (a*1LL*b)%MOD;
}
	
struct Combi
{
	vector<int> fact;
	vector<int> ifact;
	vector<int> inv;
	vector<int> pow2;	
	int modpow(int a, int b)
	{
		int r=1;
		while(b)
		{
			if(b&1) r=mult(r,a);
			a=mult(a,a);
			b>>=1;
		}
		return r;
	}
	int choose(int a, int b)
	{
		if(a<b) return 0;
		if(b==0) return 1;
		if(a==b) return 1;
		return mult(fact[a],mult(ifact[b],ifact[a-b]));
	}
	int inverse(int a)
	{
		return modpow(a,MOD-2);
	}
	void init(int _n)
	{
		fact.clear(); ifact.clear(); inv.clear(); pow2.clear();
		fact.resize(_n+1);
		ifact.resize(_n+1);
		inv.resize(_n+1);
		pow2.resize(_n+1);
		pow2[0]=1;
		ifact[0]=1;
		fact[0]=1;
		for(int i=1;i<=_n;i++)
		{
			pow2[i]=add(pow2[i-1],pow2[i-1]);
			fact[i]=mult(fact[i-1],i);
			//ifact[i]=mult(ifact[i-1],inv[i]);
		}
		ifact[_n] = inverse(fact[_n]);
		for(int i=_n-1;i>=1;i--)
		{
		    ifact[i] = mult(ifact[i + 1], i + 1);
		}
		for(int i=1;i<=_n;i++)
		{
		    inv[i] = mult(fact[i-1],ifact[i]);
		}
	}
};

Combi combi;
int par[201111];
vi adj[201111];

int inv(int x)
{
	return combi.modpow(x,MOD-2);
}

int sz[211111];
int h[211111];
map<int,ii> *dp[211111];
int maxh[211111];
int cnt[211111];
void prep(int u)
{
	sz[u]=1;
	maxh[u]=h[u];
	cnt[h[u]]++;
	for(int i=0;i<adj[u].size();i++)
	{
		int v=adj[u][i];
		h[v]=h[u]+1;
		prep(v);
		maxh[u]=max(maxh[u],maxh[v]);
		sz[u]+=sz[v];
	}
}

ii combine(ii x, ii y)
{
	ii nw;
	nw.fi=mult(x.fi,y.fi);
	nw.se.fi=add(mult(x.fi,y.se.fi),mult(x.se.fi,y.fi));
	nw.se.se=add(mult(x.fi,y.se.se),add(mult(y.fi,x.se.se),add(mult(x.se.fi,y.se.fi),add(mult(x.se.fi,y.se.se),mult(x.se.se,y.se.fi)))));
	//nw.se=add(mult(x.se,y.se),mult(x.fi,y.fi));
	return nw;
}

void dfs(int v, int p, bool keep)
{
	//cerr<<v<<' '<<maxh[v]<<'\n';
    int mx = -1, bigChild = -1;
    for(auto u : adj[v])
       if(u != p && maxh[u] > mx)
           mx = maxh[u], bigChild = u;
    for(auto u : adj[v])
       if(u != p && u != bigChild)
           dfs(u, v, 0);
    if(bigChild != -1)
        dfs(bigChild, v, 1), dp[v] = dp[bigChild];
    else
        dp[v] = new map<int,ii> ();
    dp[v]->insert(mp(h[v],mp(1,mp(1,0))));//mp(combi.pow2[sz[v]-1],combi.pow2[sz[v]-1]);
    for(auto u : adj[v])
    {
       if(u != p && u != bigChild)
       {
           for(auto x : *dp[u])
           {
               dp[v]->at(x.fi) = combine(dp[v]->at(x.fi), x.se);
           }
	   }
   }
    for(auto u : adj[v])
    {
       if(u != p && u != bigChild)
       {
		   for(auto x : *dp[u])
           {
			   dp[v]->at(x.fi).fi=add(dp[v]->at(x.fi).fi,dp[v]->at(x.fi).se.se);
			   dp[v]->at(x.fi).se.se=0;
		   }
	   }
   }
}

int main()
{
	ios_base::sync_with_stdio(0); cin.tie(0);
	combi.init(300001);
	int n; cin>>n; n++;
	for(int i=1;i<n;i++)
	{
		cin>>par[i]; adj[par[i]].pb(i);
	}
	prep(0);
	dfs(0,-1,0);
	int ans=0;
	for(auto x : *dp[0])
	{
		ans = add(ans, mult(combi.pow2[n - cnt[x.fi]], x.se.se.fi));
		//cerr<<x.fi<<' '<<x.se.fi<<' '<<x.se.se.fi<<' '<<x.se.se.se<<'\n';
	}
	cout<<ans<<'\n';
}


Measured memory_bytes: 62208