Submission #723070

#TimeUsernameProblemLanguageResultExecution timeMemory
723070loctildoreBi-ing Lottery Treekets (CCO22_day2problem1)C++14
25 / 25
257 ms129100 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define f first #define s second #define endl '\n' #define all(x) begin(x), end(x) #define MOD 1000000007 int n, k; int sz[4069]; int balls[4069]; int lft[4069], rht[4069], dir[4069]; ll perm[4069][4069]; bool done[4069][4069]; ll dp[4069][4069]; int calsz(int x) { if (!x) return 0; return sz[x] = calsz(lft[x]) + calsz(rht[x]) + 1 - balls[x]; } ll fnd(int x, int carry) { if (x == 0) return carry == 0; if (done[x][carry]) return dp[x][carry]; done[x][carry] = true; if (carry > sz[x]) return dp[x][carry] = 0; if (carry == sz[x]) { ll tmp = (fnd(lft[x], sz[lft[x]]) * fnd(rht[x], sz[rht[x]])) % MOD; tmp = (tmp * perm[carry + balls[x]][balls[x]]) % MOD; return dp[x][carry] = tmp; } if (dir[x] && balls[x] + carry >= sz[rht[x]]) { ll tmp = (fnd(lft[x], balls[x] + carry - sz[rht[x]]) * fnd(rht[x], sz[rht[x]])) % MOD; tmp = (tmp * perm[carry + balls[x]][balls[x]]) % MOD; dp[x][carry] = (dp[x][carry] + tmp) % MOD; } if (!dir[x] && balls[x] + carry >= sz[lft[x]]) { ll tmp = (fnd(lft[x], sz[lft[x]]) * fnd(rht[x], balls[x] + carry - sz[lft[x]])) % MOD; tmp = (tmp * perm[carry + balls[x]][balls[x]]) % MOD; dp[x][carry] = (dp[x][carry] + tmp) % MOD; } for (int i = 0; i <= balls[x]; i++) { ll tmp; if (dir[x]) { if (sz[rht[x]] <= carry + i) continue; tmp = (fnd(lft[x], balls[x] - i) * fnd(rht[x], carry + i)) % MOD; } else { if (sz[lft[x]] <= carry + i) continue; tmp = (fnd(lft[x], carry + i) * fnd(rht[x], balls[x] - i)) % MOD; } tmp = (tmp * perm[balls[x]][balls[x] - i]) % MOD; tmp = (tmp * perm[carry + i][i]) % MOD; dp[x][carry] = (dp[x][carry] + tmp) % MOD; } //cout<<x<<' '<<carry<<'?'<<sz[x]<<':'<<dp[x][carry]<<endl; return dp[x][carry]; } int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); cin>>n>>k; for (int i = 0; i < 4069; i++) { perm[i][0] = 1; for (int j = 1; j <= i; j++) { perm[i][j] = (perm[i-1][j-1] * i) % MOD; } } for (int i = 0; i < k; i++) { int a; cin>>a; balls[a]++; } for (int i = 1; i <= n; i++) { cin>>lft[i]>>rht[i]; dir[rht[i]] = true; } calsz(1); cout<<fnd(1, 0)<<endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...