首先对于偶数 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")

京公网安备 11010502036488号