Problem p03561 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<ll, ll> P;

#define each(i, a) for (auto &&i : a)
#define FOR(i, a, b) for (ll i = (a), __last_##i = (b); i < __last_##i; i++)
#define RFOR(i, a, b) for (ll i = (b)-1, __last_##i = (a); i >= __last_##i; i--)
#define REP(i, n) FOR(i, 0, n)
#define RREP(i, n) RFOR(i, 0, n)
#define __GET_MACRO3(_1, _2, _3, NAME, ...) NAME
#define rep(...) __GET_MACRO3(__VA_ARGS__, FOR, REP)(__VA_ARGS__)
#define rrep(...) __GET_MACRO3(__VA_ARGS__, RFOR, RREP)(__VA_ARGS__)
#define pb push_back
#define all(a) (a).begin(), (a).end()
#define chmin(x, v) x = min(x, v)
#define chmax(x, v) x = max(x, v)

const ll linf = 1e18;
const double eps = 1e-12;
const double pi = acos(-1);

template <typename T> istream &operator>>(istream &is, vector<T> &vec) {
  each(x, vec) is >> x;
  return is;
}
template <typename T> ostream &operator<<(ostream &os, const vector<T> &vec) {
  rep(i, vec.size()) {
    if (i)
      os << " ";
    os << vec[i];
  }
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const vector<vector<T>> &vec) {
  rep(i, vec.size()) {
    if (i)
      os << endl;
    os << vec[i];
  }
  return os;
}

vector<ll> X, Xodd;
// vector<ll> solve(ll n, ll K, ll d) {
//     vector<ll> res;
//     rep(i, n) {
//         ll rest = n-i;
//         res.pb((X[rest] + d - i) / 2 / (X[rest-1] + 1));
//     }
//     return res;
// }
vector<ll> solve(const ll n, const ll K, const ll d) {
  vector<ll> res;
  assert(X[n] + d >= 0);
  ll tgt = (X[n] + d) / 2;
  // cout << d << " " << X[n] << " " << n << " " << X[n-1] << endl;
  // assert(tgt == (X[n]-1)/2);
  rep(i, n) {
    ll bsz = X[n - i - 1] + 1;
    ll idx = tgt / bsz;
    tgt -= idx * bsz;
    res.pb(idx);
    assert(0 <= idx && idx < K);
    if (tgt == 0)
      return res;
    --tgt;
    assert(tgt >= 0);
  }
  return res;
}
// const ll maxX = 1e12;
// const ll thX = maxX;
void init_X(const ll n, const ll K) {
  X.assign(n + 1, 0);
  Xodd.assign(n + 1, 0);
  rep(i, 1, n + 1) {
    if (X[i - 1] < linf) {
      X[i] = min((X[i - 1] + 1) * K, linf);
    } else {
      X[i] = linf;
    }
    Xodd[i] = (X[i - 1] + 1) * K % 2;
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  ll n, K;
  cin >> K >> n;
  vector<ll> ans;
  init_X(n, K);
  // cout << X << endl;
  if (K % 2 == 0) {
    ans.pb(K / 2 - 1);
    rep(i, 1, n) { ans.pb(K - 1); }
  } else {
    rep(i, n) {
      if (X[n - i] < linf) {
        vector<ll> a = solve(n - i, K, -1 - i);
        each(x, a) ans.pb(x);
        break;
      } else {
        ans.pb(K / 2);
      }
    }
    // ans = solve(n, K, -1);
  }
  each(x, ans)++ x;
  cout << ans << endl;
}


Fixed submission:
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<ll, ll> P;

#define each(i, a) for (auto &&i : a)
#define FOR(i, a, b) for (ll i = (a), __last_##i = (b); i < __last_##i; i++)
#define RFOR(i, a, b) for (ll i = (b)-1, __last_##i = (a); i >= __last_##i; i--)
#define REP(i, n) FOR(i, 0, n)
#define RREP(i, n) RFOR(i, 0, n)
#define __GET_MACRO3(_1, _2, _3, NAME, ...) NAME
#define rep(...) __GET_MACRO3(__VA_ARGS__, FOR, REP)(__VA_ARGS__)
#define rrep(...) __GET_MACRO3(__VA_ARGS__, RFOR, RREP)(__VA_ARGS__)
#define pb push_back
#define all(a) (a).begin(), (a).end()
#define chmin(x, v) x = min(x, v)
#define chmax(x, v) x = max(x, v)

const ll linf = 1e18;
const double eps = 1e-12;
const double pi = acos(-1);

template <typename T> istream &operator>>(istream &is, vector<T> &vec) {
  each(x, vec) is >> x;
  return is;
}
template <typename T> ostream &operator<<(ostream &os, const vector<T> &vec) {
  rep(i, vec.size()) {
    if (i)
      os << " ";
    os << vec[i];
  }
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const vector<vector<T>> &vec) {
  rep(i, vec.size()) {
    if (i)
      os << endl;
    os << vec[i];
  }
  return os;
}

vector<ll> X, Xodd;
// vector<ll> solve(ll n, ll K, ll d) {
//     vector<ll> res;
//     rep(i, n) {
//         ll rest = n-i;
//         res.pb((X[rest] + d - i) / 2 / (X[rest-1] + 1));
//     }
//     return res;
// }
vector<ll> solve(const ll n, const ll K, const ll d) {
  vector<ll> res;
  assert(X[n] + d >= 0);
  ll tgt = (X[n] + d) / 2;
  // cout << d << " " << X[n] << " " << n << " " << X[n-1] << endl;
  // assert(tgt == (X[n]-1)/2);
  rep(i, n) {
    ll bsz = X[n - i - 1] + 1;
    ll idx = tgt / bsz;
    tgt -= idx * bsz;
    res.pb(idx);
    assert(0 <= idx && idx < K);
    if (tgt == 0)
      return res;
    --tgt;
    assert(tgt >= 0);
  }
  return res;
}
// const ll maxX = 1e12;
// const ll thX = maxX;
void init_X(const ll n, const ll K) {
  X.assign(n + 1, 0);
  Xodd.assign(n + 1, 0);
  rep(i, 1, n + 1) {
    if (X[i - 1] < 1e12) {
      X[i] = min((X[i - 1] + 1) * K, linf);
    } else {
      X[i] = linf;
    }
    Xodd[i] = (X[i - 1] + 1) * K % 2;
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  ll n, K;
  cin >> K >> n;
  vector<ll> ans;
  init_X(n, K);
  // cout << X << endl;
  if (K % 2 == 0) {
    ans.pb(K / 2 - 1);
    rep(i, 1, n) { ans.pb(K - 1); }
  } else {
    rep(i, n) {
      if (X[n - i] < linf) {
        vector<ll> a = solve(n - i, K, -1 - i);
        each(x, a) ans.pb(x);
        break;
      } else {
        ans.pb(K / 2);
      }
    }
    // ans = solve(n, K, -1);
  }
  each(x, ans)++ x;
  cout << ans << endl;
}