Submission #1341110

#TimeUsernameProblemLanguageResultExecution timeMemory
1341110aykhnMonster-Go (EGOI25_monstergo)C++20
100 / 100
1 ms344 KiB
#include <bits/stdc++.h>

using namespace std;

const int MXN = 5e1 + 5;

int n;
int dp[MXN][MXN];
int nck[MXN][MXN];
array<int, 2> par[MXN][MXN];
vector<array<int, 2>> parts;
vector<vector<int>> ans;

void f(int i, int msk, int tar)
{
  if (__builtin_popcount(msk) > tar) return;
  if (__builtin_popcount(msk) + (int)parts.size() - i < tar) return;
  if (i == parts.size())
  {
    ans.push_back({});
    for (int j = 0; j < parts.size(); j++)
    {
      if (msk >> j & 1)
      {
        for (int x = parts[j][0]; x <= parts[j][1]; x++) ans.back().push_back(x);
      }
    }
    return;
  }
  f(i + 1, msk | (1 << i), tar);
  f(i + 1, msk, tar);
}
signed main()
{
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  for (int i = 0; i < 50; i++) nck[i][0] = 1;
  for (int i = 1; i < 50; i++)
  {
    for (int j = 0; j < 50; j++)
    {
      nck[i][j] = nck[i - 1][j] + (j ? nck[i - 1][j - 1] : 0);
      if (nck[i][j] > 100) nck[i][j] = 100;
    }
  }
  cin >> n;
  dp[0][0] = 1;
  for (int i = 0; i <= 50; i++)
  {
    for (int j = 1; j <= n; j++)
    {
      for (int sz : {1, 2, 3, 4, 6, 12})
      {
        int k = 12 / sz;
        for (int cnt = k; cnt * sz <= i; cnt++)
        {
          if (nck[cnt][k] > j) continue;
          if (dp[i - cnt * sz][j - nck[cnt][k]])
          {
            par[i][j] = {cnt, sz};
            dp[i][j] = 1;
          }
        }
      }
    }
  }
  int x = 0, y = n;
  while (x <= 50 && !dp[x][y]) x++;
  assert(x <= 50);
  while (x && y)
  {
    auto [cnt, sz] = par[x][y];
    int k = 12 / sz;
    int l = x - cnt * sz + 1;
    parts.clear();
    for (int i = 0; i < cnt; i++)
    {
      parts.push_back({l, l + sz - 1});
      l += sz;
    }
    f(0, 0, k);
    x -= cnt * sz, y -= nck[cnt][k];
  }
  for (int i = 0; i < ans.size(); i++)
  {
    for (int &j : ans[i]) cout << j - 1 << ' ';
    cout << '\n';
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...