/* ***********************************************
Author        :yang12138
Created Time  :2017年12月11日 星期一 16时14分35秒
File Name     :E.cpp
************************************************ */
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <string>
#include <math.h>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <deque>
#include <map>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;
typedef pair<int,int>pii;
#define lson (root<<1)
#define rson (root<<1|1)

const int N=2e5+10;
const int mod=1e9+7;

struct Edge{
	int to,nex;
}e[N];

int head[N],cnt;
void add_edge(int u,int v){
	e[cnt].to=v,e[cnt].nex=head[u],head[u]=cnt++;
}

deque<int>dp[3][N];
int md,num[N];
void dfs(int u,int d){
	md=max(md,d);
	num[d]++;

	int sz=0;
	for(int i=head[u];~i;i=e[i].nex){
		int v=e[i].to;
		dfs(v,d+1);

		if(dp[0][v].size()>dp[0][u].size()){
			for(int j=0;j<3;j++) swap(dp[j][v],dp[j][u]);
		}

		int s=dp[0][v].size();
		sz=max(sz,s);

		for(int j=0;j<s;j++){
			ll tmp[3]={};
			for(int a=0;a<3;a++){
				for(int b=0;b<3;b++){
					int c=min(2,a+b);
					tmp[c]+=1LL*dp[a][v][j]*dp[b][u][j];
					tmp[c]%=mod;
				}
			}
			for(int k=0;k<3;k++) dp[k][u][j]=tmp[k];
		}
		for(int j=0;j<3;j++){
			deque<int>tmp;
			dp[j][v].swap(tmp);
		}
	}

	dp[0][u].push_front(1);
	dp[1][u].push_front(1);
	dp[2][u].push_front(0);

	for(int i=0;i<=sz;i++){
		dp[0][u][i]=(dp[0][u][i]+dp[2][u][i])%mod;
		dp[2][u][i]=0;
	}
}

ll pw[N];
void solve(){
	mem(head,-1),cnt=0;

	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		int f;
		scanf("%d",&f);
		add_edge(f,i);
	}

	dfs(0,0);
	pw[0]=1;
	for(int i=1;i<N;i++) pw[i]=pw[i-1]*2%mod;

	ll ans=0;
	for(int i=0;i<=md;i++){
		ans+=dp[1][0][i]*pw[n+1-num[i]];
		ans%=mod;
	}
	printf("%lld\n",ans);
}

int main(){
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    
	solve();
    return 0;
}
