#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <string>
#include <bitset>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <sstream>
#include <stack>
#include <iomanip>
using namespace std;
#define pb push_back
#define mp make_pair
typedef pair<int,int> pii;
typedef long long ll;
typedef double ld;
typedef vector<int> vi;
#define fi first
#define se second
#define fe first
#define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
#define Edg int M=0,fst[SZ],vb[SZ],nxt[SZ];void ad_de(int a,int b){++M;nxt[M]=fst[a];fst[a]=M;vb[M]=b;}void adde(int a,int b){ad_de(a,b);ad_de(b,a);}
#define Edgc int M=0,fst[SZ],vb[SZ],nxt[SZ],vc[SZ];void ad_de(int a,int b,int c){++M;nxt[M]=fst[a];fst[a]=M;vb[M]=b;vc[M]=c;}void adde(int a,int b,int c){ad_de(a,b,c);ad_de(b,a,c);}
#define es(x,e) (int e=fst[x];e;e=nxt[e])
#define esb(x,e,b) (int e=fst[x],b=vb[e];e;e=nxt[e],b=vb[e])
#define SZ 666666
int n,fa[SZ],ds[SZ],dfn[SZ],C=0,dep[SZ]; Edg
vector<int> ps[SZ];
void dfs(int x,int d=0)
{
	++ds[d]; dfn[x]=++C; dep[x]=d+1; ps[d].pb(x);
	for esb(x,e,b) dfs(b,d+1);
}
const ll MOD=1e9+7;
#define D 20
int up[200099][D];
void buildt()
{
    for(int i=1;i<=n;i++) up[i][0]=fa[i]; up[0][0]=-1;
    for(int g=1;g<D;g++)
        for(int i=0;i<=n;i++)
            if(up[i][g-1]!=-1) up[i][g]=up[up[i][g-1]][g-1];
}
int jmp(int x,int d)
{
    for(int i=D-1;i>=0;i--)
        if(up[x][i]==-1||dep[up[x][i]]<d);else x=up[x][i];
    return x;
}
int lca(int x,int y)
{
    if(dep[x]>dep[y]) swap(x,y);
    y=jmp(y,dep[x]);
    if(x==y) return x;
    for(int i=D-1;i>=0;i--)
        if(up[x][i]!=up[y][i]) x=up[x][i], y=up[y][i];
    return fa[x];
}
typedef pair<int,int> pii;
//vs: points in vtree 
int sn,ss[SZ],vn,vs[SZ],stn=0,st[SZ],vfa[SZ];
vector<int> ch[SZ];
bool cmp_dfsn(int a,int b) {return dfn[a]<dfn[b];}
void build()
{
    vn=stn=0;
    sort(ss+1,ss+1+sn,cmp_dfsn);
    for(int i=1;i<=sn;i++) vs[++vn]=ss[i];
    for(int i=1;i<=sn;i++)
    {
        int x=ss[i];
        if(!stn) {st[++stn]=x; vfa[x]=-1; continue;}
        int lca=::lca(x,st[stn]);
        for(;dep[st[stn]]>dep[lca];--stn)
            if(dep[st[stn-1]]<=dep[lca]) vfa[st[stn]]=lca; 
        if(st[stn]!=lca)
        {
            vs[++vn]=lca;
            vfa[lca]=st[stn];
            st[++stn]=lca;
        }
        vfa[x]=lca; st[++stn]=x;
    }
    for(int i=1;i<=vn;++i) ch[vs[i]].clear();
    for(int i=1;i<=vn;++i)
    	if(vfa[vs[i]]>=0) ch[vfa[vs[i]]].pb(vs[i]);
}
ll p2[SZ];
int cw=0;
pair<ll,ll> wk(int x)
{
	ll a[3]={1,0,0};
	if(dep[x]==cw+1) a[1]=1;
	for(auto c:ch[x])
	{
		pair<ll,ll> pp=wk(c);
		ll w[2]={pp.fi,pp.se},s[3]={0,0,0};
		for(int i=0;i<2;++i)
			for(int j=0;j<3;++j)
				(s[min(i+j,2)]+=a[j]*w[i])%=MOD;
		for(int j=0;j<3;++j) a[j]=s[j];
	}
	return pair<ll,ll>((a[0]+a[2])%MOD,a[1]);
}
pair<ll,ll> operator * (pair<ll,ll> a,pair<ll,ll> b)
{
	a.se=(a.se*b.fi+a.fi*b.se)%MOD;
	a.fi=a.fi*b.fi%MOD; return a;
}
int main()
{
	scanf("%d",&n); p2[0]=1;
	for(int i=1;i<=n;++i) p2[i]=p2[i-1]*2%MOD;
	for(int i=1;i<=n;++i)
		scanf("%d",fa+i),ad_de(fa[i],i);
	dfs(0); buildt();
	pair<ll,ll> s(1,0);
	for(int i=0;i<=n;++i)
		if(ps[i].size())
		{
			sn=0; cw=i;
			for(auto p:ps[i]) ss[++sn]=p;
			if(i) ss[++sn]=0; build();
			pair<ll,ll> g=wk(0);
			g.fi=(g.fi+g.se)%MOD;
			s=s*g;
		}
	printf("%d\n",int(s.se));
}


Measured memory_bytes: 91136