func_code_string: #include <bits/stdc++.h>   using namespace std;   struct listNode {     long long int n;     listNode *next;     listNode(long long int n = 0LL) : n(n), next(NULL) {}   };   long long int num;   listNode *edge[100100], *tail[100100];   long long int color[100100];   void insertEdge(long long int a, long long int b) {     if (!edge[a]) {       edge[a] = new listNode(b);       tail[a] = edge[a];     } else {       tail[a]->next = new listNode(b);       tail[a] = tail[a]->next;     }   }   void dfs(long long int node, long long int parent, long long int &res0,            long long int &res1) {     long long int a, b, temp;     if (color[node]) {       res0 = 0LL;       res1 = 1LL;     } else {       res0 = 1LL;       res1 = 0LL;     }     for (listNode *ptr = edge[node]; ptr; ptr = ptr->next) {       if (ptr->n == parent) continue;       dfs(ptr->n, node, a, b);       if (color[node]) {         res1 *= (a + b);         if (res1 >= 1000000007) res1 %= 1000000007;       } else {         res1 *= (a + b);         if (res1 >= 1000000007) res1 %= 1000000007;         temp = res0 * b;         if (temp >= 1000000007) temp %= 1000000007;         res1 += temp;         if (res1 >= 1000000007) res1 %= 1000000007;         res0 *= (a + b);         if (res0 >= 1000000007) res0 %= 1000000007;       }     }   }   int main() {     long long int i, a, b;     scanf( %I64d , &num);     for (i = 1; i <= num - 1; i++) {       scanf( %I64d , &a);       insertEdge(i, a);       insertEdge(a, i);     }     for (i = 0; i < num; i++) scanf( %I64d , color + i);     dfs(0, 0, a, b);     printf( %I64d n , b);     return 0;   }   