牛客 吴楚月的表达式

题目链接:https://ac.nowcoder.com/acm/contest/9984/H

思路:直接从根开始dfs  dfs额外维护两个参数,一个是上次的最后一个数,一个是除了上次的数的和

这样是为了再做乘法和除法的时候 能用上一次的最后一个数来做, 记得+2次mod  因为lst和now加起来的可能小于-(1e9+7)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e5+10;
 4 const int mod=1e9+7;
 5 #define ll long long
 6 #define ull unsigned long long
 7 #define pi pair<int,int>
 8 #define fi first
 9 #define sc second
10 #define pb push_back
11 vector<int>E[maxn];
12 ll val[maxn];
13 char s[maxn];
14 ll ans[maxn];
15 
16 ll power(ll b,ll n)
17 {
18     ll r=1;
19     while(n)
20     {
21         if(n%2) r=r*b%mod;
22         b=b*b%mod;
23         n>>=1;
24     }
25     return r;
26 }
27 
28 
29 void dfs(int u,ll lst,ll now)
30 {
31     for(auto &v:E[u])
32     {
33         if(s[v]=='*')
34         {
35             ll tmp=now*val[v]%mod;
36             dfs(v,lst,tmp);
37         }
38         else if(s[v]=='/')
39         {
40             ll tmp=now*power(val[v],mod-2)%mod;
41             dfs(v,lst,tmp);
42         }
43         else if(s[v]=='+')
44         {
45             ll tmp=(lst+now)%mod;
46             dfs(v,tmp,val[v]);
47         }
48         else
49         {
50             ll tmp=(lst+now)%mod;
51             dfs(v,tmp,-val[v]);
52         }
53     }
54     ans[u]=(lst+now+mod+mod)%mod;
55 }
56 
57 
58 int main()
59 {
60     ios::sync_with_stdio(0);
61     cin.tie(0);
62     int n;
63     cin>>n;
64     for(int i=1;i<=n;i++)cin>>val[i];
65     for(int i=2;i<=n;i++)
66     {
67         int x;
68         cin>>x;
69         E[x].pb(i);
70     }
71     for(int i=2;i<=n;i++) cin>>s[i];
72     dfs(1,0,val[1]);
73     for(int i=1;i<=n;i++)
74     {
75         if(i!=1) cout<<" ";
76         cout<<ans[i];
77     }
78 
79 
80 
81 
82 
83 }
View Code

 

posted @ 2021-02-24 20:01  canwinfor  阅读(76)  评论(0)    收藏  举报