牛客 吴楚月的表达式
题目链接: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 }

浙公网安备 33010602011771号