#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>
#define llint long long
#define mod 1000000007

using namespace std;
typedef pair<llint, llint> P;

llint modpow(llint a, llint n)
{
	if(n == 0) return 1;
	if(n % 2){
		return ((a%mod) * (modpow(a, n-1)%mod)) % mod;
	}
	else{
		return modpow((a*a)%mod, n/2) % mod;
	}
}

llint n;
vector<llint> G[200005];
vector<llint> vec[200005];
llint inv2;

llint dfs(llint v)
{
	llint ret = v;
	vector<P> tmp;
	for(int i = 0; i < G[v].size(); i++){
		llint res = dfs(G[v][i]);
		tmp.push_back(make_pair((llint)vec[res].size(), res));
	}
	sort(tmp.rbegin(), tmp.rend());
	
	if(tmp.size() > 0){
		ret = tmp[0].second;
		
		if(tmp.size() > 1){
			llint pos = (llint)tmp.size()-1;
			for(int i = 1; i <= vec[tmp[1].second].size(); i++){
				llint sum = 0, mul = 1;
				for(int j = pos; j >= 0; j--){
					vector<llint> &cvec = vec[tmp[j].second];
					if(cvec.size() < i){
						pos--;
						continue;
					}
					llint p = cvec[(llint)cvec.size()-i];
					mul *= (1-p+mod) % mod, mul %= mod;
					sum += p * modpow((1-p+mod) % mod, mod-2) % mod, sum %= mod;
				}
				vec[ret][(llint)vec[ret].size()-i] = sum * mul % mod;
			}
		}
	}
	
	vec[ret].push_back(inv2);
	return ret;
}

int main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	
	inv2 = modpow(2, mod-2);
	
	cin >> n;
	llint p;
	for(int i = 1; i <= n; i++){
		cin >> p;
		G[p].push_back(i);
	}
	
	llint res = dfs(0);
	
	llint ans = 0;
	for(int i = 0; i < vec[res].size(); i++) ans += vec[res][i], ans %= mod;
	ans *= modpow(2, n+1), ans %= mod;
	cout << ans << endl;
	
	return 0;
}