QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#105062#6351. Exact SubsequencesmaspyAC ✓3ms3540kbC++2021.1kb2023-05-12 21:31:132023-05-12 21:31:23

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-05-12 21:31:23]
  • 评测
  • 测评结果:AC
  • 用时:3ms
  • 内存:3540kb
  • [2023-05-12 21:31:13]
  • 提交

answer

#line 1 "library/my_template.hpp"
#if defined(LOCAL)
#include <my_template_compiled.hpp>
#else
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")

#include <bits/stdc++.h>

using namespace std;

using ll = long long;
using u32 = unsigned int;
using u64 = unsigned long long;
using i128 = __int128;

template <class T>
constexpr T infty = 0;
template <>
constexpr int infty<int> = 1'000'000'000;
template <>
constexpr ll infty<ll> = ll(infty<int>) * infty<int> * 2;
template <>
constexpr u32 infty<u32> = infty<int>;
template <>
constexpr u64 infty<u64> = infty<ll>;
template <>
constexpr i128 infty<i128> = i128(infty<ll>) * infty<ll>;
template <>
constexpr double infty<double> = infty<ll>;
template <>
constexpr long double infty<long double> = infty<ll>;

using pi = pair<ll, ll>;
using vi = vector<ll>;
template <class T>
using vc = vector<T>;
template <class T>
using vvc = vector<vc<T>>;
template <class T>
using vvvc = vector<vvc<T>>;
template <class T>
using vvvvc = vector<vvvc<T>>;
template <class T>
using vvvvvc = vector<vvvvc<T>>;
template <class T>
using pq = priority_queue<T>;
template <class T>
using pqg = priority_queue<T, vector<T>, greater<T>>;

#define vv(type, name, h, ...) \
  vector<vector<type>> name(h, vector<type>(__VA_ARGS__))
#define vvv(type, name, h, w, ...)   \
  vector<vector<vector<type>>> name( \
      h, vector<vector<type>>(w, vector<type>(__VA_ARGS__)))
#define vvvv(type, name, a, b, c, ...)       \
  vector<vector<vector<vector<type>>>> name( \
      a, vector<vector<vector<type>>>(       \
             b, vector<vector<type>>(c, vector<type>(__VA_ARGS__))))

// https://trap.jp/post/1224/
#define FOR1(a) for (ll _ = 0; _ < ll(a); ++_)
#define FOR2(i, a) for (ll i = 0; i < ll(a); ++i)
#define FOR3(i, a, b) for (ll i = a; i < ll(b); ++i)
#define FOR4(i, a, b, c) for (ll i = a; i < ll(b); i += (c))
#define FOR1_R(a) for (ll i = (a)-1; i >= ll(0); --i)
#define FOR2_R(i, a) for (ll i = (a)-1; i >= ll(0); --i)
#define FOR3_R(i, a, b) for (ll i = (b)-1; i >= ll(a); --i)
#define overload4(a, b, c, d, e, ...) e
#define overload3(a, b, c, d, ...) d
#define FOR(...) overload4(__VA_ARGS__, FOR4, FOR3, FOR2, FOR1)(__VA_ARGS__)
#define FOR_R(...) overload3(__VA_ARGS__, FOR3_R, FOR2_R, FOR1_R)(__VA_ARGS__)

#define FOR_subset(t, s) \
  for (ll t = (s); t >= 0; t = (t == 0 ? -1 : (t - 1) & (s)))
#define all(x) x.begin(), x.end()
#define len(x) ll(x.size())
#define elif else if

#define eb emplace_back
#define mp make_pair
#define mt make_tuple
#define fi first
#define se second

#define stoi stoll

int popcnt(int x) { return __builtin_popcount(x); }
int popcnt(u32 x) { return __builtin_popcount(x); }
int popcnt(ll x) { return __builtin_popcountll(x); }
int popcnt(u64 x) { return __builtin_popcountll(x); }
// (0, 1, 2, 3, 4) -> (-1, 0, 1, 1, 2)
int topbit(int x) { return (x == 0 ? -1 : 31 - __builtin_clz(x)); }
int topbit(u32 x) { return (x == 0 ? -1 : 31 - __builtin_clz(x)); }
int topbit(ll x) { return (x == 0 ? -1 : 63 - __builtin_clzll(x)); }
int topbit(u64 x) { return (x == 0 ? -1 : 63 - __builtin_clzll(x)); }
// (0, 1, 2, 3, 4) -> (-1, 0, 1, 0, 2)
int lowbit(int x) { return (x == 0 ? -1 : __builtin_ctz(x)); }
int lowbit(u32 x) { return (x == 0 ? -1 : __builtin_ctz(x)); }
int lowbit(ll x) { return (x == 0 ? -1 : __builtin_ctzll(x)); }
int lowbit(u64 x) { return (x == 0 ? -1 : __builtin_ctzll(x)); }

template <typename T, typename U>
T ceil(T x, U y) {
  return (x > 0 ? (x + y - 1) / y : x / y);
}
template <typename T, typename U>
T floor(T x, U y) {
  return (x > 0 ? x / y : (x - y + 1) / y);
}
template <typename T, typename U>
pair<T, T> divmod(T x, U y) {
  T q = floor(x, y);
  return {q, x - q * y};
}

template <typename T, typename U>
T SUM(const vector<U> &A) {
  T sum = 0;
  for (auto &&a: A) sum += a;
  return sum;
}

#define MIN(v) *min_element(all(v))
#define MAX(v) *max_element(all(v))
#define LB(c, x) distance((c).begin(), lower_bound(all(c), (x)))
#define UB(c, x) distance((c).begin(), upper_bound(all(c), (x)))
#define UNIQUE(x) \
  sort(all(x)), x.erase(unique(all(x)), x.end()), x.shrink_to_fit()

template <typename T>
T POP(deque<T> &que) {
  T a = que.front();
  que.pop_front();
  return a;
}
template <typename T>
T POP(pq<T> &que) {
  T a = que.top();
  que.pop();
  return a;
}
template <typename T>
T POP(pqg<T> &que) {
  assert(!que.empty());
  T a = que.top();
  que.pop();
  return a;
}
template <typename T>
T POP(vc<T> &que) {
  assert(!que.empty());
  T a = que.back();
  que.pop_back();
  return a;
}

template <typename F>
ll binary_search(F check, ll ok, ll ng, bool check_ok = true) {
  if (check_ok) assert(check(ok));
  while (abs(ok - ng) > 1) {
    auto x = (ng + ok) / 2;
    tie(ok, ng) = (check(x) ? mp(x, ng) : mp(ok, x));
  }
  return ok;
}
template <typename F>
double binary_search_real(F check, double ok, double ng, int iter = 100) {
  FOR(iter) {
    double x = (ok + ng) / 2;
    tie(ok, ng) = (check(x) ? mp(x, ng) : mp(ok, x));
  }
  return (ok + ng) / 2;
}

template <class T, class S>
inline bool chmax(T &a, const S &b) {
  return (a < b ? a = b, 1 : 0);
}
template <class T, class S>
inline bool chmin(T &a, const S &b) {
  return (a > b ? a = b, 1 : 0);
}

// ? は -1
vc<int> s_to_vi(const string &S, char first_char) {
  vc<int> A(S.size());
  FOR(i, S.size()) { A[i] = (S[i] != '?' ? S[i] - first_char : -1); }
  return A;
}

template <typename T, typename U>
vector<T> cumsum(vector<U> &A, int off = 1) {
  int N = A.size();
  vector<T> B(N + 1);
  FOR(i, N) { B[i + 1] = B[i] + A[i]; }
  if (off == 0) B.erase(B.begin());
  return B;
}

// stable sort
template <typename T>
vector<int> argsort(const vector<T> &A) {
  vector<int> ids(len(A));
  iota(all(ids), 0);
  sort(all(ids),
       [&](int i, int j) { return (A[i] == A[j] ? i < j : A[i] < A[j]); });
  return ids;
}

// A[I[0]], A[I[1]], ...
template <typename T>
vc<T> rearrange(const vc<T> &A, const vc<int> &I) {
  vc<T> B(len(I));
  FOR(i, len(I)) B[i] = A[I[i]];
  return B;
}
#endif
#line 1 "library/other/io.hpp"
// based on yosupo's fastio
#include <unistd.h>

namespace fastio {
#define FASTIO
// クラスが read(), print() を持っているかを判定するメタ関数
struct has_write_impl {
  template <class T>
  static auto check(T &&x) -> decltype(x.write(), std::true_type{});

  template <class T>
  static auto check(...) -> std::false_type;
};

template <class T>
class has_write : public decltype(has_write_impl::check<T>(std::declval<T>())) {
};

struct has_read_impl {
  template <class T>
  static auto check(T &&x) -> decltype(x.read(), std::true_type{});

  template <class T>
  static auto check(...) -> std::false_type;
};

template <class T>
class has_read : public decltype(has_read_impl::check<T>(std::declval<T>())) {};

struct Scanner {
  FILE *fp;
  char line[(1 << 15) + 1];
  size_t st = 0, ed = 0;
  void reread() {
    memmove(line, line + st, ed - st);
    ed -= st;
    st = 0;
    ed += fread(line + ed, 1, (1 << 15) - ed, fp);
    line[ed] = '\0';
  }
  bool succ() {
    while (true) {
      if (st == ed) {
        reread();
        if (st == ed) return false;
      }
      while (st != ed && isspace(line[st])) st++;
      if (st != ed) break;
    }
    if (ed - st <= 50) {
      bool sep = false;
      for (size_t i = st; i < ed; i++) {
        if (isspace(line[i])) {
          sep = true;
          break;
        }
      }
      if (!sep) reread();
    }
    return true;
  }
  template <class T, enable_if_t<is_same<T, string>::value, int> = 0>
  bool read_single(T &ref) {
    if (!succ()) return false;
    while (true) {
      size_t sz = 0;
      while (st + sz < ed && !isspace(line[st + sz])) sz++;
      ref.append(line + st, sz);
      st += sz;
      if (!sz || st != ed) break;
      reread();
    }
    return true;
  }
  template <class T, enable_if_t<is_integral<T>::value, int> = 0>
  bool read_single(T &ref) {
    if (!succ()) return false;
    bool neg = false;
    if (line[st] == '-') {
      neg = true;
      st++;
    }
    ref = T(0);
    while (isdigit(line[st])) { ref = 10 * ref + (line[st++] & 0xf); }
    if (neg) ref = -ref;
    return true;
  }
  template <typename T,
            typename enable_if<has_read<T>::value>::type * = nullptr>
  inline bool read_single(T &x) {
    x.read();
    return true;
  }
  bool read_single(double &ref) {
    string s;
    if (!read_single(s)) return false;
    ref = std::stod(s);
    return true;
  }
  bool read_single(char &ref) {
    string s;
    if (!read_single(s) || s.size() != 1) return false;
    ref = s[0];
    return true;
  }
  template <class T>
  bool read_single(vector<T> &ref) {
    for (auto &d: ref) {
      if (!read_single(d)) return false;
    }
    return true;
  }
  template <class T, class U>
  bool read_single(pair<T, U> &p) {
    return (read_single(p.first) && read_single(p.second));
  }
  template <size_t N = 0, typename T>
  void read_single_tuple(T &t) {
    if constexpr (N < std::tuple_size<T>::value) {
      auto &x = std::get<N>(t);
      read_single(x);
      read_single_tuple<N + 1>(t);
    }
  }
  template <class... T>
  bool read_single(tuple<T...> &tpl) {
    read_single_tuple(tpl);
    return true;
  }
  void read() {}
  template <class H, class... T>
  void read(H &h, T &... t) {
    bool f = read_single(h);
    assert(f);
    read(t...);
  }
  Scanner(FILE *fp) : fp(fp) {}
};

struct Printer {
  Printer(FILE *_fp) : fp(_fp) {}
  ~Printer() { flush(); }

  static constexpr size_t SIZE = 1 << 15;
  FILE *fp;
  char line[SIZE], small[50];
  size_t pos = 0;
  void flush() {
    fwrite(line, 1, pos, fp);
    pos = 0;
  }
  void write(const char val) {
    if (pos == SIZE) flush();
    line[pos++] = val;
  }
  template <class T, enable_if_t<is_integral<T>::value, int> = 0>
  void write(T val) {
    if (pos > (1 << 15) - 50) flush();
    if (val == 0) {
      write('0');
      return;
    }
    if (val < 0) {
      write('-');
      val = -val; // todo min
    }
    size_t len = 0;
    while (val) {
      small[len++] = char(0x30 | (val % 10));
      val /= 10;
    }
    for (size_t i = 0; i < len; i++) { line[pos + i] = small[len - 1 - i]; }
    pos += len;
  }
  void write(const string s) {
    for (char c: s) write(c);
  }
  void write(const char *s) {
    size_t len = strlen(s);
    for (size_t i = 0; i < len; i++) write(s[i]);
  }
  void write(const double x) {
    ostringstream oss;
    oss << fixed << setprecision(15) << x;
    string s = oss.str();
    write(s);
  }
  void write(const long double x) {
    ostringstream oss;
    oss << fixed << setprecision(15) << x;
    string s = oss.str();
    write(s);
  }
  template <typename T,
            typename enable_if<has_write<T>::value>::type * = nullptr>
  inline void write(T x) {
    x.write();
  }
  template <class T>
  void write(const vector<T> val) {
    auto n = val.size();
    for (size_t i = 0; i < n; i++) {
      if (i) write(' ');
      write(val[i]);
    }
  }
  template <class T, class U>
  void write(const pair<T, U> val) {
    write(val.first);
    write(' ');
    write(val.second);
  }
  template <size_t N = 0, typename T>
  void write_tuple(const T t) {
    if constexpr (N < std::tuple_size<T>::value) {
      if constexpr (N > 0) { write(' '); }
      const auto x = std::get<N>(t);
      write(x);
      write_tuple<N + 1>(t);
    }
  }
  template <class... T>
  bool write(tuple<T...> tpl) {
    write_tuple(tpl);
    return true;
  }
  template <class T, size_t S>
  void write(const array<T, S> val) {
    auto n = val.size();
    for (size_t i = 0; i < n; i++) {
      if (i) write(' ');
      write(val[i]);
    }
  }
  void write(i128 val) {
    string s;
    bool negative = 0;
    if (val < 0) {
      negative = 1;
      val = -val;
    }
    while (val) {
      s += '0' + int(val % 10);
      val /= 10;
    }
    if (negative) s += "-";
    reverse(all(s));
    if (len(s) == 0) s = "0";
    write(s);
  }
};
Scanner scanner = Scanner(stdin);
Printer printer = Printer(stdout);
void flush() { printer.flush(); }
void print() { printer.write('\n'); }
template <class Head, class... Tail>
void print(Head &&head, Tail &&... tail) {
  printer.write(head);
  if (sizeof...(Tail)) printer.write(' ');
  print(forward<Tail>(tail)...);
}

void read() {}
template <class Head, class... Tail>
void read(Head &head, Tail &... tail) {
  scanner.read(head);
  read(tail...);
}
} // namespace fastio
using fastio::print;
using fastio::flush;
using fastio::read;

#define INT(...)   \
  int __VA_ARGS__; \
  read(__VA_ARGS__)
#define LL(...)   \
  ll __VA_ARGS__; \
  read(__VA_ARGS__)
#define STR(...)      \
  string __VA_ARGS__; \
  read(__VA_ARGS__)
#define CHAR(...)   \
  char __VA_ARGS__; \
  read(__VA_ARGS__)
#define DBL(...)      \
  double __VA_ARGS__; \
  read(__VA_ARGS__)

#define VEC(type, name, size) \
  vector<type> name(size);    \
  read(name)
#define VV(type, name, h, w)                     \
  vector<vector<type>> name(h, vector<type>(w)); \
  read(name)

void YES(bool t = 1) { print(t ? "YES" : "NO"); }
void NO(bool t = 1) { YES(!t); }
void Yes(bool t = 1) { print(t ? "Yes" : "No"); }
void No(bool t = 1) { Yes(!t); }
void yes(bool t = 1) { print(t ? "yes" : "no"); }
void no(bool t = 1) { yes(!t); }
#line 2 "library/nt/primetest.hpp"
struct m64 {
  using i64 = int64_t;
  using u64 = uint64_t;
  using u128 = __uint128_t;

  inline static u64 m, r, n2; // r * m = -1 (mod 1<<64), n2 = 1<<128 (mod m)
  static void set_mod(u64 m) {
    assert((m & 1) == 1);
    m64::m = m;
    n2 = -u128(m) % m;
    r = m;
    FOR(_, 5) r *= 2 - m * r;
    r = -r;
    assert(r * m == -1ull);
  }
  static u64 reduce(u128 b) { return (b + u128(u64(b) * r) * m) >> 64; }

  u64 x;
  m64() : x(0) {}
  m64(u64 x) : x(reduce(u128(x) * n2)){};
  u64 val() const {
    u64 y = reduce(x);
    return y >= m ? y - m : y;
  }
  m64 &operator+=(m64 y) {
    x += y.x - (m << 1);
    x = (i64(x) < 0 ? x + (m << 1) : x);
    return *this;
  }
  m64 &operator-=(m64 y) {
    x -= y.x;
    x = (i64(x) < 0 ? x + (m << 1) : x);
    return *this;
  }
  m64 &operator*=(m64 y) {
    x = reduce(u128(x) * y.x);
    return *this;
  }
  m64 operator+(m64 y) const { return m64(*this) += y; }
  m64 operator-(m64 y) const { return m64(*this) -= y; }
  m64 operator*(m64 y) const { return m64(*this) *= y; }
  bool operator==(m64 y) const {
    return (x >= m ? x - m : x) == (y.x >= m ? y.x - m : y.x);
  }
  bool operator!=(m64 y) const { return not operator==(y); }
  m64 pow(u64 n) const {
    m64 y = 1, z = *this;
    for (; n; n >>= 1, z *= z)
      if (n & 1) y *= z;
    return y;
  }
};

bool primetest(const uint64_t x) {
  using u64 = uint64_t;
  if (x == 2 or x == 3 or x == 5 or x == 7) return true;
  if (x % 2 == 0 or x % 3 == 0 or x % 5 == 0 or x % 7 == 0) return false;
  if (x < 121) return x > 1;
  const u64 d = (x - 1) >> __builtin_ctzll(x - 1);
  m64::set_mod(x);
  const m64 one(1), minus_one(x - 1);
  auto ok = [&](u64 a) {
    auto y = m64(a).pow(d);
    u64 t = d;
    while (y != one and y != minus_one and t != x - 1) y *= y, t <<= 1;
    if (y != minus_one and t % 2 == 0) return false;
    return true;
  };
  if (x < (1ull << 32)) {
    for (u64 a: {2, 7, 61})
      if (not ok(a)) return false;
  } else {
    for (u64 a: {2, 325, 9375, 28178, 450775, 9780504, 1795265022}) {
      if (x <= a) return true;
      if (not ok(a)) return false;
    }
  }
  return true;
}
#line 3 "library/nt/factor.hpp"

mt19937_64 rng_mt{random_device{}()};
ll rnd(ll n) { return uniform_int_distribution<ll>(0, n - 1)(rng_mt); }

ll rho(ll n, ll c) {
  m64::set_mod(n);
  assert(n > 1);
  const m64 cc(c);
  auto f = [&](m64 x) { return x * x + cc; };
  m64 x = 1, y = 2, z = 1, q = 1;
  ll g = 1;
  const ll m = 1LL << (__lg(n) / 5); // ?
  for (ll r = 1; g == 1; r <<= 1) {
    x = y;
    FOR(_, r) y = f(y);
    for (ll k = 0; k < r and g == 1; k += m) {
      z = y;
      FOR(_, min(m, r - k)) y = f(y), q *= x - y;
      g = gcd(q.val(), n);
    }
  }
  if (g == n) do {
      z = f(z);
      g = gcd((x - z).val(), n);
    } while (g == 1);
  return g;
}

ll find_prime_factor(ll n) {
  assert(n > 1);
  if (primetest(n)) return n;
  FOR(_, 100) {
    ll m = rho(n, rnd(n));
    if (primetest(m)) return m;
    n = m;
  }
  cerr << "failed" << endl;
  assert(false);
  return -1;
}

// ソートしてくれる
vc<pair<ll, int>> factor(ll n) {
  assert(n >= 1);
  vc<pair<ll, int>> pf;
  FOR3(p, 2, 100) {
    if (p * p > n) break;
    if (n % p == 0) {
      ll e = 0;
      do { n /= p, e += 1; } while (n % p == 0);
      pf.eb(p, e);
    }
  }
  while (n > 1) {
    ll p = find_prime_factor(n);
    ll e = 0;
    do { n /= p, e += 1; } while (n % p == 0);
    pf.eb(p, e);
  }
  sort(all(pf));
  return pf;
}

vc<pair<ll, int>> factor_by_lpf(ll n, vc<int>& lpf) {
  vc<pair<ll, int>> res;
  while (n > 1) {
    int p = lpf[n];
    int e = 0;
    while (n % p == 0) {
      n /= p;
      ++e;
    }
    res.eb(p, e);
  }
  return res;
}
#line 1 "library/nt/stern_brocot_tree.hpp"

struct Stern_Brocot_Tree {
  using PATH = vi; // はじめは R

  static tuple<PATH, pi, pi> get_path_and_range(pi x) {
    PATH path;
    pi l = {0, 1}, r = {1, 0};
    pi m = {1, 1};
    ll det_l = l.fi * x.se - l.se * x.fi;
    ll det_r = r.fi * x.se - r.se * x.fi;
    ll det_m = det_l + det_r;
    while (1) {
      if (det_m == 0) break;
      ll k = ceil(-det_m, det_r);
      path.eb(k);
      l = {l.fi + k * r.fi, l.se + k * r.se};
      m = {l.fi + r.fi, l.se + r.se};
      det_l += k * det_r;
      det_m += k * det_r;
      if (det_m == 0) break;
      k = ceil(det_m, -det_l);
      path.eb(k);
      r = {r.fi + k * l.fi, r.se + k * l.se};
      m = {l.fi + r.fi, l.se + r.se};
      det_r += k * det_l;
      det_m += k * det_l;
    }
    return {path, l, r};
  }

  static PATH get_path(pi x) {
    auto [path, l, r] = get_path_and_range(x);
    return path;
  }

  static pair<pi, pi> range(pi x) {
    auto [path, l, r] = get_path_and_range(x);
    return {l, r};
  }

  // x in range(y)
  static bool in_subtree(pi x, pi y) {
    auto [l, r] = range(y);
    bool ok_l = i128(x.fi) * l.se - i128(x.se) * l.fi > 0;
    bool ok_r = i128(r.fi) * x.se - i128(r.se) * x.fi > 0;
    return ok_l && ok_r;
  }

  template <typename T = ll>
  static pair<T, T> from_path(PATH& p) {
    using P = pair<T, T>;
    P l = {0, 1}, r = {1, 0};
    FOR(i, len(p)) {
      ll k = p[i];
      if (i % 2 == 0) {
        l.fi += T(k) * r.fi;
        l.se += T(k) * r.se;
      }
      if (i % 2 == 1) {
        r.fi += T(k) * l.fi;
        r.se += T(k) * l.se;
      }
    }
    return {l.fi + r.fi, l.se + r.se};
  }

  static pair<pi, pi> child(pi x) {
    auto [l, r] = range(x);
    pi lc = {l.fi + x.fi, l.se + x.se};
    pi rc = {x.fi + r.fi, x.se + r.se};
    return {lc, rc};
  }

  static pi LCA(pi x, pi y) {
    auto Px = get_path(x);
    auto Py = get_path(y);
    vi P;
    FOR(i, min(len(Px), len(Py))) {
      ll k = min(Px[i], Py[i]);
      P.eb(k);
      if (k < Px[i] || k < Py[i]) break;
    }
    return from_path(P);
  }

  static pi LA(pi x, ll dep) {
    pi l = {0, 1}, r = {1, 0};
    pi m = {1, 1};
    ll det_l = l.fi * x.se - l.se * x.fi;
    ll det_r = r.fi * x.se - r.se * x.fi;
    ll det_m = det_l + det_r;
    while (1) {
      if (det_m == 0 || dep == 0) break;
      ll k = min(dep, ceil(-det_m, det_r));
      l = {l.fi + k * r.fi, l.se + k * r.se};
      m = {l.fi + r.fi, l.se + r.se};
      det_l += k * det_r;
      det_m += k * det_r;
      dep -= k;
      if (det_m == 0 || dep == 0) break;
      k = min(dep, ceil(det_m, -det_l));
      r = {r.fi + k * l.fi, r.se + k * l.se};
      m = {l.fi + r.fi, l.se + r.se};
      det_r += k * det_l;
      det_m += k * det_l;
      dep -= k;
    }
    if (dep == 0) return m;
    return {-1, -1};
  }

  static string to_string(PATH& p) {
    string res;
    char c = 'L';
    for (auto&& x: p) {
      c = 'L' + 'R' - c;
      if (x == 0) continue;
      res += c;
      res += " " + std::to_string(x);
    }
    return res;
  }
};
#line 5 "main.cpp"

void solve() {
  LL(N, K);

  N += 2;
  auto pf = factor(N);
  ll M = len(pf);
  vi prod(1 << M, 1);
  FOR(i, M) FOR(s, 1 << i) prod[s | 1 << i] = prod[s] * pf[i].fi;

  auto f = [&](ll n) -> ll {
    // 1 以上 n 以下で N と素
    ll cnt = 0;
    FOR(s, 1 << M) {
      ll x = n / prod[s];
      cnt += (popcnt(s) % 2 == 0 ? x : -x);
    }
    return cnt;
  };

  if (f(N) < K) return print(-1);

  Stern_Brocot_Tree SBT;

  ll x = binary_search([&](int x) -> bool { return f(x) >= K; }, N, 0);
  auto P = SBT.get_path(pi{x, N});
  P.erase(P.begin());
  P[0] -= 1;
  int a = (P[0] == 0 ? 1 : 0);
  if (a) P.erase(P.begin());
  print(len(P), a);
  print(P);
}

signed main() {
  INT(T);
  FOR(T) solve();
  return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 2ms
memory: 3380kb

input:

8
3 1
3 2
3 3
3 4
3 5
1000000000 1
99824 4353
2129721 207087

output:

1 0
3
2 0
1 1
2 1
1 1
1 1
3
-1
1 0
1000000000
11 0
9 2 2 1 6 2 1 2 7 1 1
9 0
9 9 8 2 4 4 3 5 3

result:

ok 42 numbers

Test #2:

score: 0
Accepted
time: 3ms
memory: 3472kb

input:

100
716270982 22102638
553198855 114744220
973042933 952648509
411855162 12679271
376478639 766516692
701616593 797071538
567088052 832850102
231532599 350649206
638081144 950645496
769653386 879396229
641178981 7765699
683883038 664333826
193902679 953508821
399344120 470742245
477410846 571075073
...

output:

17 0
12 3 1 3 1 1 18 1 8 1 2 3 5 1 3 11 2
19 0
2 5 1 1 9 9 2 2 1 6 1 4 3 2 1 1 2 4 2
-1
21 0
12 3 1 5 1 1 3 5 1 1 3 1 1 1 19 2 1 1 1 1 3
-1
-1
-1
-1
-1
-1
18 0
78 1 9 4 1 1 1 1 3 1 1 5 1 1 1 16 2 5
-1
-1
-1
-1
-1
16 0
1 6 1 3 1 1 21 2 30 2 15 2 5 1 1 4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
16 0
2 5 9 1 1...

result:

ok 516 numbers

Test #3:

score: 0
Accepted
time: 2ms
memory: 3400kb

input:

100
803577926 732588284
959524552 483692625
937450949 420573788
394257859 670341039
468416448 316269090
710340143 302537836
914428480 585041837
849300324 990185122
893426960 565815587
601153216 726270361
820206654 408906693
809261091 899294748
482302622 501315087
415385715 149723632
473655879 445673...

output:

-1
-1
19 0
1 7 1 1 2 1 43 1 32 2 1 1 1 1 7 1 15 1 1
-1
-1
17 1
1 5 2 2 1 1 46 1 1 2 2 2 10 2 2 7 8
-1
-1
-1
-1
18 1
341 1 2 1 1 1 1 4 1 1 6 4 1 1 1 9 1 11
-1
-1
21 0
1 1 2 3 1 15 1 1 2 11 1 5 1 9 2 1 1 2 1 2 2
17 1
15 1 12 1 2 1 1 5 1 1 1 1 16 5 15 1 5
-1
17 1
1 3 9 1 5 1 59 1 6 2 2 1 1 25 1 1 5
-1
...

result:

ok 596 numbers

Test #4:

score: 0
Accepted
time: 1ms
memory: 3516kb

input:

100
310973933 1
851906850 1
506991370 1
812835085 1
184055713 1
330046155 1
742234340 1
35064224 1
428641100 1
742376022 1
854982930 1
934966715 1
11821239 1
24666398 1
953701756 1
283022550 1
652857323 1
225091259 1
443560524 1
646130347 1
704023856 1
225047814 1
643039211 1
10434355 1
142462737 1
...

output:

1 0
310973933
1 0
851906850
1 0
506991370
1 0
812835085
1 0
184055713
1 0
330046155
1 0
742234340
1 0
35064224
1 0
428641100
1 0
742376022
1 0
854982930
1 0
934966715
1 0
11821239
1 0
24666398
1 0
953701756
1 0
283022550
1 0
652857323
1 0
225091259
1 0
443560524
1 0
646130347
1 0
704023856
1 0
22504...

result:

ok 300 numbers

Test #5:

score: 0
Accepted
time: 2ms
memory: 3536kb

input:

100
189 575154303
244 513866599
724 893121161
460 783742901
791 932434605
602 341436697
920 357555133
938 708487917
652 277902399
588 246605698
268 208941807
19 820801694
79 546956091
383 505858553
727 722075077
19 573727679
863 991923941
551 733860625
436 76355365
102 899550340
73 950034371
433 732...

output:

-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1

result:

ok 100 numbers

Test #6:

score: 0
Accepted
time: 1ms
memory: 3536kb

input:

100
223092868 522742773
223092868 278957336
223092868 10795972
223092868 933104349
223092868 703746065
223092868 499801401
223092868 87818865
223092868 690822764
223092868 773395398
223092868 714043760
223092868 510458728
223092868 528769614
223092868 59550625
223092868 975799724
223092868 830655839...

output:

-1
-1
15 0
2 2 1 1 1 2 4 4 2 15 3 8 15 1 10
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
18 0
5 1 1 8 1 1 2 1 46 1 5 5 1 5 3 1 1 2
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
19 0
3 1 5 1 3 1 7 ...

result:

ok 204 numbers

Test #7:

score: 0
Accepted
time: 2ms
memory: 3480kb

input:

100
999999935 310403983
999999935 72364213
999999935 397038456
999999935 75080336
999999935 454985457
999999935 778137418
999999935 478883812
999999935 588122347
999999935 651540264
999999935 650019250
999999935 584491303
999999935 852022109
999999935 204794560
999999935 38478503
999999935 633363053...

output:

16 0
2 4 1 1 19 1 1 5 2 2 2 21 1 3 1 107
13 0
12 1 4 1 1 9 1 3 82 1 78 1 22
19 0
1 1 1 12 1 9 1 2 2 1 1 2 7 3 23 11 1 1 1
12 0
12 3 7 2 4 1 45 2 2 2 4 118
16 0
1 5 18 1 1 2 144 3 1 1 5 5 2 1 4 1
23 1
3 1 1 33 1 3 3 3 2 1 1 1 4 1 1 1 1 8 1 1 1 2 3
20 0
1 11 2 1 18 29 1 3 2 3 1 1 2 1 1 1 1 1 1 7
20 1
...

result:

ok 1869 numbers

Test #8:

score: 0
Accepted
time: 0ms
memory: 3372kb

input:

100
2 948507270
2 461613425
2 139535653
2 575270914
2 738803143
2 726699316
2 103994146
2 249524708
2 922817781
2 838029880
2 667513691
2 439784727
2 821461860
2 581510875
2 990481633
2 337473349
2 648674686
2 323922097
2 905107222
2 325476490
2 221111618
2 768519935
2 38017075
2 968148470
2 2181080...

output:

-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1

result:

ok 100 numbers

Test #9:

score: 0
Accepted
time: 1ms
memory: 3436kb

input:

100
994593598 798824698
994593598 836802674
994593598 681520523
994593598 794670609
994593598 473875349
994593598 10246152
994593598 185505534
994593598 890463296
994593598 99179674
994593598 495304199
994593598 834562731
994593598 674734647
994593598 725257131
994593598 1210263
994593598 172395848
...

output:

-1
-1
-1
-1
-1
19 0
16 1 4 4 9 1 4 1 6 3 1 2 1 4 7 1 2 1 1
-1
-1
15 1
1 5 4 11 3 1 4 1 3 2 1 1 241 5 2
-1
-1
-1
-1
14 0
149 1 3 2 3 2 1 12 1 2 2 15 1 40
14 1
17 9 1 7 1 5 30 1 2 1 1 8 11 4
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
18 1
1 8 5 1 2 16 1 2 19 1 1 2 2 2 1 1 11 3
15 0
8 1 5 9 16 3 3 3 3 9 4 1 2...

result:

ok 478 numbers

Test #10:

score: 0
Accepted
time: 2ms
memory: 3436kb

input:

100
611471244 7
285534859 285324624
365254431 8
302700479 10
531626021 1
241407326 119249315
960694338 1
444253010 166613760
378833523 7
792109060 10
41233968 1
19856541 1
948544448 1
480404093 428613111
460814812 1
452369404 213580071
792771208 1
108109408 49140485
640233262 1
693587230 237801302
8...

output:

4 0
47036248 1 2 3
-1
2 0
45656803 7
2 0
30270047 9
1 0
531626021
13 1
81 1 240 1 2 1 1 1 2 31 1 1 5
1 0
960694338
16 1
7 3 6 1 11 1 9 2 1 6 2 6 3 6 1 1
3 0
42092612 1 7
6 0
27314104 1 1 2 2 1
1 0
41233968
1 0
19856541
1 0
948544448
-1
1 0
460814812
-1
1 0
792771208
-1
1 0
640233262
-1
15 1
3 1 28 1...

result:

ok 689 numbers

Test #11:

score: 0
Accepted
time: 2ms
memory: 3396kb

input:

100
486624528 41
826504481 751367707
277260365 1
198842419 197411751
221851582 80
935299711 1
91749879 1
473820636 154959954
978802934 4
388928056 175983814
453541903 450882755
708135976 1
997863449 1
516874672 1
816187863 533373945
23910223 1
132118186 61473249
585259343 2
816641908 408260772
65256...

output:

3 0
4021689 3 39
-1
1 0
277260365
-1
7 0
928248 3 3 1 1 1 5
1 0
935299711
1 0
91749879
16 1
1 1 8 6 36 1 2 2 2 1 7 1 18 2 4 1
3 0
139828989 1 5
-1
-1
1 0
708135976
1 0
997863449
1 0
516874672
16 1
4 2 5 1 5 39 2 1 1 11 1 1 2 15 1 8
1 0
23910223
-1
2 0
292629671 1
-1
16 1
2 3 1 11 3 3 20 6 4 6 1 2 2 ...

result:

ok 596 numbers

Test #12:

score: 0
Accepted
time: 2ms
memory: 3540kb

input:

100
483413348 443
820011935 687
805999661 803837970
880414348 80
370099111 358160589
250102150 98773273
726543000 75
613461382 1
86774162 1
891363559 867271687
30278513 704
112738310 215
89445142 44709732
75764504 776
702277221 443543882
678216524 1
274629757 1
304066337 930
104562487 1
654995466 21...

output:

7 0
372715 1 1 6 19 1 3
6 0
1126389 42 1 4 1 1
-1
6 0
2944528 1 1 2 29 1
-1
-1
7 0
4876126 1 1 7 1 3 1
1 0
613461382
1 0
86774162
-1
9 0
34445 1 1 4 1 3 1 7 1
7 0
253343 1 1 11 4 1 2
-1
8 0
48722 6 2 4 1 2 1 4
21 1
1 1 2 1 4 1 1 3 2 1 5 2 4 1 8 4 2 1 5 1 8
1 0
678216524
1 0
274629757
6 0
323130 13 1...

result:

ok 783 numbers

Test #13:

score: 0
Accepted
time: 0ms
memory: 3524kb

input:

100
283550352 94526185
867566523 2944
562028786 254142878
887589426 295811826
145509559 6216
176986027 2331
225110614 2501
44722121 42087327
969367610 1
513981059 8315
682666637 607754222
229626250 74846852
423497030 617
747716605 596923368
656821366 317814670
922276433 350
568171727 551682118
66597...

output:

12 1
2 1675 2 1 7 9 2 4 2 2 1 2
8 0
190213 9 1 2 6 4 1 3
15 1
9 2 5 2 2 3 4 8 3 1 1 1 2 8 29
15 1
3 6 2 2 10 5 6 26 1 11 3 2 1 1 2
11 0
15606 1 1 2 3 1 1 2 1 4 13
10 0
46029 5 1 1 1 27 1 1 1 1
4 0
29700 1 8 841
17 1
21 1 4 1 1 1 1 2 7 19 1 5 3 1 1 1 1
1 0
969367610
7 0
56043 5 1 29 7 3 1
20 1
9 1 1 ...

result:

ok 891 numbers