#include "circuit.h"
#include <bits/stdc++.h>
using namespace std;
#define MAXN 200001
#define nl '\n'
#define ff first
#define ss second
#define ll long long
#define ld long double
#define terminator main
#define pll pair<ll,ll>
#define add insert
#define append push_back
#define pii pair<int,int>
#define all(x) (x).begin(),(x).end()
const int mod = 1000002022;
int add(int a, int b){
return (a + b) % mod;
}
int mul(int a, int b){
return (1ll * a * b) % mod;
}
int n;
int p[MAXN];
int cnt[MAXN];
int dp[MAXN][2];
vector<int> a[MAXN];
void dfs(int v){
int N = 0;
vector<int> cnt {1};
for(auto & i : a[v]){
if(i < n) dfs(i);
cnt.append(0);
for(int j = N; j >= 0; j--){
cnt[j + 1] = add(cnt[j + 1], mul(cnt[j], dp[i][1]));
cnt[j] = mul(cnt[j], dp[i][0]);
}
N++;
}
dp[v][0] = dp[v][1] = 0;
for(int i = 0; i <= N; i++){
dp[v][0] = add(dp[v][0], mul(cnt[i], N - i));
dp[v][1] = add(dp[v][1], mul(cnt[i], i));
cnt[i] = 0;
}
}
void init(int N, int M, vector<int> P, vector<int> A) {
n = N;
for(int i = 1; i < P.size(); i++){
p[i] = P[i];
a[p[i]].append(i);
}
for(int i = 0; i < M; i++)
dp[i + n][A[i]] = 1;
cnt[0] = 1;
}
int count_ways(int l, int r){
for(int i = l; i <= r; i++)
swap(dp[i][0], dp[i][1]);
dfs(0);
return dp[0][1];
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |