Submission #990786

#TimeUsernameProblemLanguageResultExecution timeMemory
990786jakobrsAncient Machine 2 (JOI23_ancient2)C++17
99 / 100
37 ms604 KiB
#include "ancient2.h"

#include <bitset>
#include <memory>
#include <numeric>
#include <string>
#include <vector>

void gauss(std::bitset<1001> (&matrix)[1000]) {
  for (int col = 0; col < 1000; col++) {
    int pivot_row;
    for (int row = col; row < 1000; row++) {
      if (matrix[row][col]) {
        pivot_row = row;
        break;
      }
    }
    std::swap(matrix[col], matrix[pivot_row]);
    for (int row = col + 1; row < 1000; row++)
      if (matrix[row][col])
        matrix[row] ^= matrix[col];
  }
  for (int col = 999; col >= 0; col--)
    for (int row = col - 1; row >= 0; row--)
      if (matrix[row][col])
        matrix[row] ^= matrix[col];
}

std::string Solve(int N) {
  constexpr int W = 53;
  int m = W * 2;
  std::vector<int> a(m), b(m);
  std::vector<bool> results;
  int acc_phi = 0;

  auto matrix = std::make_unique<std::bitset<1001>[]>(1000);
  auto init_cyclic = [&](int i) -> void {
    for (int j = 0; j < i; j++) {
      a[j] = j + 1;
      a[j + i] = j + i + 1;
      b[j] = j + 1;
      b[j + i] = j + i + 1;
    }
    a[i - 1] = 0;
    a[i - 1 + i] = i;
    b[i - 1] = 0;
    b[i - 1 + i] = i;
  };
  int cur = 0;

  // Periodic vectors
  for (int i = 1; i <= W; i++) {
    init_cyclic(i);

    int phi = 0;
    for (int j = 1; j <= i; j++)
      if (std::gcd(i, j) == 1)
        phi += 1;

    for (int j = 0; j < phi; j++) {
      for (int k = 0; k < 1000; k++) {
        if (k % i == j) {
          matrix[cur][k] = 1;
        }
      }

      std::swap(b[j], b[j + i]);
      matrix[cur++][1000] = Query(m, a, b) >= i;
      std::swap(b[j], b[j + i]);
    }
  }

  { // Block 2
    auto if_0 = 2 * W - 2;
    auto if_1 = 2 * W - 1;

    for (int i = 0; i < 2 * W - 2; i++) {
      a[i] = i + 1;
      b[i] = i + 1;
    }
    a[if_0] = if_0;
    b[if_0] = if_0;
    a[if_1] = if_1;
    b[if_1] = if_1;

    for (int i = 0; i < 2 * W - 2; i++) {
      matrix[cur][i] = 1;

      a[i] = if_0;
      b[i] = if_1;
      matrix[cur++][1000] = Query(m, a, b) == if_1;
      a[i] = i + 1;
      b[i] = i + 1;
    }
  }

  // Block 3
  init_cyclic(W);
  for (int pos = 999; cur < 1000; pos--) {
    matrix[cur][pos] = 1;

    auto i = pos % W;
    std::swap(a[W + i], b[i]);
    matrix[cur++][1000] = Query(m, a, b) >= W;
    std::swap(a[W + i], b[i]);
  }

  gauss(*(std::bitset<1001>(*)[1000])matrix.get());

  std::string s;
  for (int i = 0; i < N; i++)
    s.push_back(matrix[i][1000] ? '1' : '0');

  return s;
}

Compilation message (stderr)

ancient2.cpp: In function 'std::string Solve(int)':
ancient2.cpp:34:7: warning: unused variable 'acc_phi' [-Wunused-variable]
   34 |   int acc_phi = 0;
      |       ^~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...