首先对于偶数 m 一定无解,对于 m 最高位高于 n 也一定无解。

否则对于 m 的每一位,从高到低取出这一位的没被取出的所有倍数作为一组即可。

#include <iostream>
#include <vector>
using namespace std;

using pii = pair<int, int>;

int n;
int m;

void Solve() {
    cin >> n >> m;
    if (m % 2 == 0 || m >= 1 << (__lg(n) + 1)) {
        cout << "-1";
        return;
    }
    vector<bool> used(n + 1);
    vector<int> res;
    res.reserve(n);
    vector<pii> lr;
    for (int i = __lg(n); i > -1; i--) {
        if (m & (1 << i)) {
            int l = res.size() + 1;
            for (int j = (1 << i); j <= n; j += (1 << i)) {
                if (!used[j]) {
                    used[j] = true;
                    res.push_back(j);
                }
            }
            lr.emplace_back(l, res.size());
        }
    }
    for (const auto& x : res) {
        cout << x << ' ';
    }
    cout << '\n' << lr.size();
    for (const auto& [l, r] : lr) {
        cout << '\n' << l << ' ' << r;
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    Solve();
    return 0;
}
// 64 位输出请用 printf("%lld")