# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
787468 | thimote75 | Digital Circuit (IOI22_circuit) | C++17 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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;
}