Submission #967997

#TimeUsernameProblemLanguageResultExecution timeMemory
967997Gromp15Binaria (CCO23_day1problem1)C++17
25 / 25
230 ms106144 KiB
#include <bits/stdc++.h> #define ll long long #define ar array #define db double #define all(x) x.begin(), x.end() #define sz(x) (int)x.size() using namespace std; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); #define rint(l, r) uniform_int_distribution<int>(l, r)(rng) template<typename T> bool ckmin(T &a, const T &b) { return a > b ? a = b, 1 : 0; } template<typename T> bool ckmax(T &a, const T &b) { return a < b ? a = b, 1 : 0; } const int mod = 1e6 + 3; void fadd(int &a, int b) { a += b; if (a >= mod) a -= mod; } int binpow(int a, int b) { int r = 1; for (; b; a = (ll)a*a%mod, b >>= 1) if (b & 1) r = (ll)r*a%mod; return r; } vector<int> facs, invfacs; void init(int n) { facs.resize(n+1), invfacs.resize(n+1); facs[0] = 1; for (int i = 1; i <= n; i++) facs[i] = (ll)facs[i-1] * i % mod; invfacs[n] = binpow(facs[n], mod - 2); for (int i = n - 1; i >= 0; i--) invfacs[i] = (ll)invfacs[i+1] * (i+1) % mod; } int choose(int a, int b) { return ((ll)facs[a] * invfacs[b] % mod) * invfacs[a-b] % mod; } void test_case() { int n, k; cin >> n >> k; vector<int> a(n - k + 1); for (int &x : a) cin >> x; vector<vector<ar<int, 2>>> adj(n); for (int i = 0; i < n-k; i++) { int w = a[i+1] - a[i]; adj[i].push_back({i + k, w}); adj[i + k].push_back({i, -w}); } vector<int> col(n); vector<bool> vis(n); auto dfs = [&](auto&& s, int v) -> void { vis[v] = 1; for (auto [u, w] : adj[v]) { if (!vis[u]) { col[u] = col[v] + w; s(s, u); } assert(col[u] == (col[v] + w)); } }; for (int i = 0; i < n; i++) if (!vis[i]) dfs(dfs, i); vector<int> state(k, -1); for (int i = 0; i < k; i++) { int b = 0; for (int j = i + k; j < n; j += k) { if (abs(col[j]) > 1) { cout << 0 << '\n'; return; } if (col[j] < 0) b |= 1; if (col[j] > 0) b |= 2; } if (b == 3) { cout << 0 << '\n'; return; } if (b == 1) state[i] = 1; if (b == 2) state[i] = 0; } ar<int, 3> who{}; for (int i = 0; i < k; i++) { if (state[i] == -1) who[2]++; else if (state[i] == 0) who[0]++; else who[1]++; } if (who[1] > a[0] || who[2] + who[1] < a[0]) { cout << 0 << '\n'; return; } cout << choose(who[2], a[0] - who[1]) << '\n'; } int main() { cin.tie(0)->sync_with_stdio(0); init(1e6); int t = 1; // cin >> t; while (t--) test_case(); }
#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...