Submission #1356288

#TimeUsernameProblemLanguageResultExecution timeMemory
1356288avighnaFestivals in JOI Kingdom 2 (JOI23_festival2)C++20
10 / 100
8007 ms452 KiB
#pragma GCC optimize("Ofast,unroll-all-loops")

#include <bits/stdc++.h>

using namespace std;

int solve(vector<pair<int, int>> &a) {
  int st = 0, ans = 0;
  for (auto &[l, r] : a) {
    if (l < st) {
      continue;
    }
    ans++;
    st = r;
  }
  return ans;
}

int solve_bad(vector<pair<int, int>> &a) {
  return solve(a);
}

int solve_good(vector<pair<int, int>> &a) {
  vector<int> vs(16, -1);
  for (auto &[l, r] : a) {
    vs[r] = l;
  }
  vector<pair<int, int>> b;
  b.reserve(16);
  for (int i = 0; i < 16; ++i) {
    if (vs[i] != -1) {
      b.push_back({vs[i], i});
    }
  }
  return solve(b);
}

int main() {
  cin.tie(nullptr)->sync_with_stdio(false);

  int n, md;
  cin >> n >> md;

  int64_t ans = 0;
  string s = string(n, '*') + string(n, '.');
  sort(s.begin(), s.end());
  do {
    vector<int> a, b;
    a.reserve(8), b.reserve(8);
    for (int i = 0; i < 2 * n; ++i) {
      if (s[i] == '*') {
        a.push_back(i);
      } else {
        b.push_back(i);
      }
    }
    do {
      int good = 1;
      vector<pair<int, int>> v;
      v.reserve(8);
      for (int i = 0; i < n; ++i) {
        if (a[i] > b[i]) {
          good = 0;
        }
        v.push_back({a[i], b[i]});
      }
      if (!good) {
        continue;
      }
      if (solve_bad(v) != solve_good(v)) {
        ans++;
      }
    } while (next_permutation(b.begin(), b.end()));
  } while (next_permutation(s.begin(), s.end()));

  cout << ans % md << '\n';
}
#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...