Submission #1308984

#TimeUsernameProblemLanguageResultExecution timeMemory
1308984EthanKim8683Question (Grader is different from the original contest) (CEOI14_question_grader)C++20
100 / 100
1611 ms39688 KiB
int encode(int n, int x, int y);
int decode(int n, int q, int h);

#include <bits/stdc++.h>

// #include "question.h"

using namespace std;

const int MAXH = 12;

int fact(int n) {
  static vector<int> memo = {1};
  while (memo.size() <= n) {
    memo.push_back(memo.back() * memo.size());
  }
  return memo[n];
}

int binom(int n, int k) {
  if (n < 0 or k < 0 or n - k < 0) return 0;
  return fact(n) / (fact(k) * fact(n - k));
}

int get_key(int x) {
  x -= 1;
  int k = MAXH / 2, rv = 0;
  for (int i = 0; i < MAXH; i++) {
    int y = binom(MAXH - (i + 1), k);
    if (x >= y) {
      rv |= 1 << i;
      x -= y;
      k -= 1;
    }
  }
  return rv;
}

int encode(int n, int x, int y) {
  int k1 = get_key(x), k2 = get_key(y);
  for (int i = 0; i < MAXH; i++) {
    if ((k1 >> i & 1) == 1 and (k2 >> i & 1) == 0) return i + 1;
  }
  assert(false);
}

int decode(int n, int q, int h) { return get_key(q) >> (h - 1) & 1; }


int encode(int n, int x, int y);
int decode(int n, int q, int h);

#include <bits/stdc++.h>

// #include "question.h"

using namespace std;

const int MAXH = 12;

int fact(int n) {
  static vector<int> memo = {1};
  while (memo.size() <= n) {
    memo.push_back(memo.back() * memo.size());
  }
  return memo[n];
}

int binom(int n, int k) {
  if (n < 0 or k < 0 or n - k < 0) return 0;
  return fact(n) / (fact(k) * fact(n - k));
}

int get_key(int x) {
  x -= 1;
  int k = MAXH / 2, rv = 0;
  for (int i = 0; i < MAXH; i++) {
    int y = binom(MAXH - (i + 1), k);
    if (x >= y) {
      rv |= 1 << i;
      x -= y;
      k -= 1;
    }
  }
  return rv;
}

int encode(int n, int x, int y) {
  int k1 = get_key(x), k2 = get_key(y);
  for (int i = 0; i < MAXH; i++) {
    if ((k1 >> i & 1) == 1 and (k2 >> i & 1) == 0) return i + 1;
  }
  assert(false);
}

int decode(int n, int q, int h) { return get_key(q) >> (h - 1) & 1; }


#Verdict Execution timeMemoryGrader output
Fetching results...