bnuoj 33648 Neurotic Network(树形模拟题)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=33648
【题解】:结果先对MOD*2取模,才能得到结果是否是正确的奇偶问题,得到最后结果之后再对MOD取模。。。
【code】:
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <algorithm> 5 #include <queue> 6 7 using namespace std; 8 #define MOD 1000000007 9 10 struct Nod 11 { 12 int parent; 13 long long sum; 14 int edge; 15 int son_cnt; 16 }node[10010],temp; 17 18 int n; 19 int a[10010],b[10010],vis[10010]; 20 21 void init() 22 { 23 int i; 24 for(i=0;i<=n;i++) 25 { 26 node[i].parent=-1; 27 node[i].sum=0; 28 node[i].edge=0; 29 node[i].son_cnt=0; 30 } 31 } 32 33 int main() 34 { 35 int t; 36 scanf("%d",&t); 37 while(t--) 38 { 39 scanf("%d",&n); 40 init(); 41 int i; 42 for(i=1;i<n;i++) 43 { 44 scanf("%d",a+i); 45 } 46 for(i=1;i<n;i++) 47 { 48 scanf("%d",b+i); 49 } 50 memset(vis,0,sizeof(vis)); 51 for(i=1;i<n;i++) 52 { 53 node[i].parent=a[i]; 54 node[i].edge=b[i]; 55 node[a[i]].son_cnt++; 56 } 57 queue<Nod> Q; 58 for(i=0;i<n;i++) 59 { 60 if(node[i].son_cnt==0) 61 { 62 node[i].sum = 1; 63 Q.push(node[i]); 64 } 65 } 66 67 while(!Q.empty()) 68 { 69 temp = Q.front(); 70 Q.pop(); 71 if(temp.parent==-1) break; 72 node[temp.parent].sum+=(temp.sum*temp.edge)%(MOD*2); 73 node[temp.parent].son_cnt--; 74 if(node[temp.parent].son_cnt==0) 75 { 76 Q.push(node[temp.parent]); 77 } 78 } 79 if(node[0].sum%2==0) 80 { 81 puts("FREAK OUT"); 82 } 83 else 84 { 85 printf("%lld\n",node[0].sum%MOD); 86 } 87 } 88 return 0; 89 }