func_code_string: #include <bits/stdc++.h>   using namespace std;   const long long mod = 1000000007, inf = 1000000000;   const int N = 100010;   inline int read() {     char ch;     while (!isdigit(ch = getchar()))       ;     int x = ch -  0 ;     while (isdigit(ch = getchar())) x = (x << 1) + (x << 3) + ch -  0 ;     return x;   }   int n, cnt;   int a[N], last[N];   long long f[N][2];   struct edge {     int to, next;   } e[N << 1];   void insert(int u, int v) {     e[++cnt].to = v;     e[cnt].next = last[u];     last[u] = cnt;     e[++cnt].to = u;     e[cnt].next = last[v];     last[v] = cnt;   }   void dfs(int x, int fa) {     long long t1, t2;     if (a[x] == 1) f[x][1] = 1;     f[x][0] = f[x][1] ^ 1;     for (int i = last[x]; i; i = e[i].next)       if (e[i].to != fa) {         int y = e[i].to;         dfs(y, x);         t1 = f[x][0] * (f[y][0] + f[y][1]);         t2 = (f[x][1] * (f[y][0] + f[y][1]) + f[x][0] * f[y][1]);         f[x][0] = t1 % mod;         f[x][1] = t2 % mod;       }   }   int main() {     n = read();     for (int i = 1; i < n; i++) insert(read(), i);     for (int i = 0; i < n; i++) a[i] = read();     dfs(0, 0);     cout << f[0][1] << endl;     return 0;   }   