题意:一个长度为n的序列有2^n-1个子序列,但合法序列需满足:最大值-最小值 < d 。先给出一个序列中子序列合法的个数x和d。要求构造原序列。
题解:因为是 最大值-最小值 小于一个正整数,构造考虑特殊值:0。让所有元素相等即可。一个长度为i且元素都相等的序列一定可以被分为2^i-1个合法子序列。对n进行2^i-1的分解,类似于2进制分解,然后让相同部分的元素相等,不同部分元素相差大于d即可。
#include <bits/stdc++.h>
using namespace std;
int x, d;
vector<long long> v;
int main()
{
scanf("%d%d", &x, &d);
long long now = 1;
for(int i = 30; i >= 0 && x > 0; i--){
while(x >= (1 << i) - 1 && x > 0){
for(int j = 0; j < i; j++) v.push_back(now);
x -= (1 << i) - 1;
now += d;
}
}
printf("%d\n", v.size());
for(int i = 0, n = v.size(); i < n; i++){
printf("%I64d%c", v[i], i == n - 1 ? '\n' : ' ');
}
}