Submission #1231083

#TimeUsernameProblemLanguageResultExecution timeMemory
1231083g4yuhgBinaria (CCO23_day1problem1)C++20
25 / 25
574 ms94280 KiB
//Huyduocdithitp #include <bits/stdc++.h> typedef long long ll; #define endl '\n' #define yes cout<<"YES"<<endl; #define no cout<<"NO"<<endl; #define fi first #define se second #define pii pair<ll, ll> #define inf 1e18 #define faster ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL); #define MP make_pair #define TASK "ghuy4g" #define start if(fopen(TASK".inp","r")){freopen(TASK".inp","r",stdin);freopen(TASK".out","w",stdout);} #define LOG 19 #define N 1000006 using namespace std; bool ghuy4g; ll par[N]; ll getRoot(ll u) { if (par[u] < 0) return u; par[u] = getRoot(par[u]); return par[u]; } void join(ll u, ll v) { u = getRoot(u); v = getRoot(v); if (u == v) return; if (par[u] < par[v]) { par[u] += par[v]; par[v] = u; } else { par[v] += par[u]; par[u] = v; } } ll n, k; ll b[N], a[N]; const ll mod = 1e6 + 3; ll gt[1000006], INV[1000006]; ll POW(ll a, ll b, ll mod) { if (b == 0) return 1; ll t = POW(a, b / 2, mod); t = t * t % mod; if (b % 2 == 1) { t = t * a % mod; } return t; } ll inv(ll a, ll mod) { return POW(a, mod - 2, mod); } void pre() { gt[0] = 1; for (int i = 1; i <= 1e6; i ++) { gt[i] = gt[i - 1] * i % mod; INV[i] = inv(gt[i], mod); } } ll C(ll n, ll k, ll mod) { if (k == n || k == 0) return 1; return gt[n] * INV[k] % mod * INV[n - k] % mod; } bool klinh; signed main(void) { memset(par, -1, sizeof(par)); memset(a, -1, sizeof(a)); pre(); faster; cin >> n >> k; for (int i = 1; i <= n - k + 1; i ++) { cin >> b[i]; } for (int i = 1; i < n - k + 1; i ++) { if (b[i] == b[i + 1]) { join(i, i + k); } else if (b[i] == b[i + 1] + 1) { if (a[i] != -1 && a[i] == 0) { cout << 0; return 0; } a[i] = 1; if (a[i + k] != -1 && a[i + k] == 1) { cout << 0; return 0; } a[i + k] = 0; } else if (b[i] + 1 == b[i + 1]) { if (a[i] != -1 && a[i] == 1) { cout << 0; return 0; } a[i] = 0; if (a[i + k] != -1 && a[i + k] == 0) { cout << 0; return 0; } a[i + k] = 1; } } for (int i = 1; i <= n; i ++) { if (a[i] == -1) continue; ll root = getRoot(i); if (a[root] != -1 && a[root] != a[i]) { cout << 0; return 0; } a[getRoot(i)] = a[i]; } map<ll, ll> mp; ll sum = 0, cnt = 0; for (int i = 1; i <= k; i ++) { ll r = getRoot(i); if (a[r] == 1) sum += 1; else if (a[r] == 0) sum += 0; else { //cout << i << " root " << r << " " << a[r] << endl; mp[r] ++ ; if (mp[r] > 1) { cout << "ngu"; return 0; } cnt ++ ; } } ll left = b[1] - sum; //cout << cnt << " " << left << endl; cout << C(cnt, left, mod); cerr << fabs(&klinh - &ghuy4g) / 1048576.0; return 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...