from types import GeneratorType def bootstrap(f, stack=[]): def wrappedfunc(*args, **kwargs): if stack: return f(*args, **kwargs) to = f(*args, **kwargs) while True: if type(to) is GeneratorType: stack.append(to) to = next(to) else: stack.pop() if not stack: break to = stack[-1].send(to) return to return wrappedfunc N = int(input()) P = list(map(int, input().split())) MOD = 998244353 G = [[] for _ in range(N)] for i, p in enumerate(P): G[p-1].append(i+1) @bootstrap def dfs(n): dp = [1, 0] for v in G[n]: ndp = yield dfs(v) SUM = size[n]+size[v] merge = [0]*(SUM+1) for i in range(size[n]+1): for j in range(size[v]+1): merge[i+j] += dp[i]*ndp[j]%MOD merge[i+j] %= MOD dp = merge size[n] += size[v] ndp = [0]*(size[n]+1) for i in range(size[n]+1): if dp[i] != 0: ndp[i] += dp[i] ndp[i] %= MOD ndp[i+1] += dp[i] ndp[i+1] %= MOD SUM = 0 for i in reversed(range(size[n]+1)): ndp[i] += SUM ndp[i] %= MOD SUM += dp[i] SUM %= MOD yield ndp size = [1]*N print(sum(dfs(0))%MOD)