#include <cstdio>
#include <memory.h>
#include <cstring>
#include <vector>
#include <deque>
#include <cstdlib>
#include <queue>
#include <algorithm>
#include <cmath>
#include <cassert>
#include <functional>
#include <iostream>
#include <set>
#include <list>
#include <map>
#include <time.h>
#include <unordered_map>
#include <unordered_set>
#include <bitset>
#define sz(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()
using namespace std;

typedef unsigned long long llu;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<int, pii> piii;
typedef pair<ll, ll> pll;
typedef pair<ll, int> pli;
typedef pair<int, ll> pil;
typedef pair<string, int> psi;
const ll MOD = 1e9 + 7;
const long double PI = 3.141592653589793238462643383279502884197;

/*
3. 인접한 친구들만 보면 되는데, 여기서 잘 관리해줘야 한다.
5. 그 개수를 제외한 2의 지수승에 대해 경우의 수를 곱해준다.
*/

// 현재 목표 위치랑 지금 id 저장. 없는 정점이면 삭제.
// 다른 애들이랑 목표 위치가 다를 때 까지 뺴고.
// 현재 셋에서 그 id 소지한 애들 벡터로 전부 빼준다.
// 결과 저장하고 다음 셋으로 올리고 pq에 인접 다시 넣어준다.
// 맨 마지막것의 다음 것도 넣어준다.

// 셋에 들어가 있어야 할 정보는.
// 맨 처음 기준 id랑, 현재 같은 위치에 있는 노드의 번호. 페어 경우의 수. 
// 맨처음 기준 id로 찾을 수 있나. 

vector<int> v[200001];
vector<int> deg[200001];

int depth[200001];
int spa[200001][19];
int two[200001];
int n;
int l = 0;

ll mypow(ll a, ll b) {
	ll ret = 1;

	while (b) {
		if (b % 2) ret = ret * a % MOD;
		a = a * a % MOD;
		b /= 2;
	}

	return ret;
}

struct snode {
	int now, o, z, cnt;
};

struct pnode {
	int pa, id;
	bool operator< (const pnode v2) const {
		if (depth[pa] == depth[v2.pa]) return id > v2.id;
		return depth[pa] < depth[v2.pa];
	};
};

priority_queue<pnode> pq;
map<int, snode> ma;

void go(int o, int dep) {
	int ll = l++;
	deg[dep].push_back(ll);
	depth[ll] = dep;

	for (int i = 0; i < sz(v[o]); i++) {
		spa[l][0] = ll;
		for (int j = 1; j < 19; j++)
			spa[l][j] = spa[spa[l][j - 1]][j - 1];

		go(v[o][i], dep + 1);
	}
}

int lca(int a, int b) {
	if (depth[a] < depth[b]) swap(a, b);

	for (int i = 18; i >= 0; i--) {
		if (depth[spa[a][i]] >= depth[b])
			a = spa[a][i];
	}
	for (int i = 18; i >= 0; i--)
		if (spa[a][i] != spa[b][i]) {
			a = spa[a][i]; b = spa[b][i];
		}
	if (a != b) a = spa[a][0];

	return a;
}

ll cal(int de) {
	while (!pq.empty()) pq.pop();
	ma.clear();

	if (deg[de].empty()) return 0;

	for (int i = 0; i < sz(deg[de]); i++) {
		ma[deg[de][i]] = { deg[de][i], 1, 1, 1 };
		if (i != sz(deg[de]) - 1) pq.push({ lca(deg[de][i], deg[de][i + 1]), deg[de][i] });
	}

	while (sz(ma) > 1) {
		while (ma.find(pq.top().id) == ma.end()) pq.pop();
		pii ran = { pq.top().id, pq.top().id };
		int pre = pq.top().pa;

		while (!pq.empty()) {
			if (ma.find(pq.top().id) == ma.end()) pq.pop();
			if (pq.empty()) break;
			if (pre != pq.top().pa) break;
			ran.second = pq.top().id;
			pq.pop();
		}

		auto k = ma.lower_bound(ran.first);
		auto kkk = ma.upper_bound(ran.second);
		ran.second = kkk->first;

		ll sum = 1;
		int cnt = 0;
		for (auto i = k; i != ma.end() && i->first <= ran.second; i++) {
			sum = (sum * i->second.z) % MOD;
			cnt += i->second.cnt;
			// printf("//%d : %d %d//\n", i->first, i->second.o, i->second.z);
		}

		ll nsum = 0;
		for (auto i = k; i != ma.end() && i->first <= ran.second; i = k) {
			k = i;
			k++;
			nsum += sum * mypow(i->second.z, MOD - 2) % MOD * i->second.o % MOD;
			nsum %= MOD;

			ma.erase(i);
		}

		snode tv = { pre, nsum, (two[cnt] - nsum + MOD) % MOD, cnt };
		ma.insert({ ran.first, tv });

		k = ma.find(ran.first);
		if (k != ma.begin()) {
			auto kk = k;
			kk--;
			pq.push({ lca(kk->second.now, k->second.now), kk->first });
		}
		if (k != --ma.end()) {
			auto kk = k;
			kk++;
			pq.push({ lca(kk->second.now, k->second.now), k->first });
		}

		/*
		for (auto i = ma.begin(); i != ma.end(); i++)
			printf("(%d : %d %d %d %d) // ", i->first, i->second.now, i->second.o, i->second.z, i->second.cnt);
		printf("\n");
		*/
	}

	return (ll)ma.begin()->second.o * two[n + 1 - sz(deg[de])] % MOD;
}

int main() {
	scanf("%d", &n);

	two[0] = 1;
	for (int i = 1; i <= n; i++)
		two[i] = two[i - 1] * 2 % MOD;

	int t;
	for (int i = 1; i <= n; i++) {
		scanf("%d", &t);
		v[t].push_back(i);
	}

	go(0, 0);

	ll sum = 0;
	for (int i = 0; i <= n; i++) {
		sum = (sum + cal(i)) % MOD;
		//printf("%d : %lld\n", i, sum);
	}

	printf("%lld", sum);
}

Measured memory_bytes: 51072