#include<cstdio>
#include<cstring>

const long long mod=1000000007;

int n,x,dep,d[200001],hd[200001],cnt,ma,num,ou[200001];
long long er[200001],f[200001][3],ans,f0,f1,f2;

struct node
{
	int to,next,la;
}e[400001];

void addedge(int x,int y)
{
	e[++cnt].next=hd[x];
	e[cnt].la=0;
	e[hd[x]].la=cnt;
	hd[x]=cnt;
	e[cnt].to=y;
}

void del(int x,int i)
{
	if (hd[x]==i) hd[x]=e[i].next,e[hd[x]].la=0;
	else e[e[i].next].la=e[i].la,e[e[i].la].next=e[i].next;
}

void dfs(int x)
{
	if (d[x]==dep)
	{
		f[x][0]=f[x][1]=1; f[x][2]=0;
		num++; return;
	}
	f[x][0]=1; f[x][1]=f[x][2]=0;
	for (int i=hd[x]; i; i=e[i].next)
	{
		dfs(e[i].to);
		f0=f[x][0]; f1=f[x][1]; f2=f[x][2];
		f[x][0]=f0*(f[e[i].to][0]+f[e[i].to][2])%mod;
		f[x][1]=(f0*f[e[i].to][1]+f1*(f[e[i].to][0]+f[e[i].to][2]))%mod;
		f[x][2]=(f1*f[e[i].to][1]+f2*(f[e[i].to][0]+f[e[i].to][1]+f[e[i].to][2]))%mod;
		if (ou[e[i].to]==1) addedge(x,e[hd[e[i].to]].to),del(x,i); else
		if (ou[e[i].to]==0) del(x,i);
	}
}

int main()
{
	scanf("%d",&n); cnt=0;
	memset(hd,0,sizeof(hd)); d[0]=1;
	memset(ou,0,sizeof(ou));
	for (int i=1; i<=n; i++) scanf("%d",&x),addedge(x,i),d[i]=d[x]+1,ou[x]++;
	ma=1;
	for (int i=1; i<=n; i++)
		if (d[i]>ma) ma=d[i];
	er[0]=1;
	for (int i=1; i<=n; i++) er[i]=er[i-1]*2ll%mod;
	ans=er[n];
	for (dep=2; dep<=ma; dep++) 
	{
		num=0; dfs(0);
		ans=(ans+er[n+1-num]*f[0][1])%mod;
	}
	printf("%lld\n",ans);
	return 0;
}