# | Submission time | Handle | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
787468 | 2023-07-19T08:18:19 Z | thimote75 | Digital Circuit (IOI22_circuit) | C++17 | 0 ms | 0 KB |
#include "circuit.h" #include <bits/stdc++.h> #define num long long using namespace std; const int MOD = 1000002022; using idata = vector<signed>; using ndata = vector<num>; ndata C; ndata Gamma; idata status; idata target; int N, M; void init(int _N, int _M, idata P, idata A) { N = _N; M = _M; C .resize(N); Gamma.resize(N + 1, 1); status = A; target.resize(M); for (int i = 0; i < M; i ++) target[i] = P[i + N]; for (int i = 1; i < N + M; i ++) C[P[i]] ++; for (int i = N - 1; i >= 0; i --) Gamma[i] = (C[i] * Gamma[i + 1]) % MOD; } int count_ways(int L, int R) { L -= N; R -= N; for (int i = L; i <= R; i ++) status [i] = 1 - status[i]; ndata localC(N); int size_last = 0; num res = 0; for (int i = 0; i < M; i ++) { if (status[i] == 0) continue ; localC[target[i]] ++; } num res = 0; bool lc = true; for (int i = 0; i < N; i ++) { res += localC[i] * Gamma[i + 1]; lc &= (localC[i] + 1) == C[i]; } if (lc) return Gamma[0]; return res; }