제출 #1078957

#제출 시각아이디문제언어결과실행 시간메모리
1078957dosts디지털 회로 (IOI22_circuit)C++17
18 / 100
3050 ms3672 KiB
//Dost SEFEROĞLU #include "circuit.h" #include <bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define ff first #define ss second #define sp << " " << #define all(cont) cont.begin(),cont.end() #define vi vector<int> const int MOD = 1e9+2022,N = 1e4+1; //division yok int add(int x,int y) { return ((x+y) >= MOD ? x+y-MOD : x+y); } int mult(int x,int y){ return ((x%MOD)*(y%MOD))%MOD; } vi edges[N],dp(N,0),dp2(N,0),c(N); void dfs(int node) { for (auto it : edges[node]) dfs(it); if (edges[node].empty()) { dp[node] = c[node],dp2[node] = !c[node]; return; } int sz = edges[node].size(); vi dpp(sz+1,0),dpp2(sz+1,0); dpp2[0] = 1; for (auto it : edges[node]) { for (int j=0;j<=sz;j++) { dpp[j] = mult(dpp2[j],dp2[it]); if (j) dpp[j] = add(dpp[j],mult(dpp2[j-1],dp[it])); } for (int j=0;j<=sz;j++) dpp2[j] = dpp[j]; } dp[node] = dp2[node] = 0; for (int j=0;j<=sz;j++) { dp[node] = add(dp[node],mult(j,dpp2[j])); dp2[node] = add(dp2[node],mult(sz-j,dpp2[j])); } } void init(int32_t N, int32_t M, std::vector<int32_t> P, std::vector<int32_t> A) { for (int i=1;i<N+M;i++) { edges[P[i]].push_back(i); } for (int i=0;i<M;i++) c[N+i] = A[i]; } int32_t count_ways(int32_t L, int32_t R) { for (int i=L;i<=R;i++) c[i]^=1; dfs(0); return dp[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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...