题意:
需要你找到一个长为L的数列,有且仅有n个非空字数列中最大元素与最小元素的差小于d
题解:
找个m个数列堆,数列堆之间互不相关,这样可以很快的求解出所需的数列,对于每个数列堆,区元素都相同且为i*d,每个数列堆的长度从30开始往下遍历(因为n>=l,且n<=1e8)
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 10000+5;
long long x,d;
long long a[N];
int main()
{
cin >> x >> d;
long long l=0,i=0;
int mi=30;
while(x){
int t = pow(2,mi) - 1;
while(t>x){
mi --;
t = pow(2,mi) - 1;
}
x-=t;
for(int j=0;j<mi;j++) a[l++] = d + i * d;
i ++;
}
cout << l << endl;
for(int i=0;i<l-1;i++) cout << a[i] << " ";
cout << a[l-1] << endl;
return 0;
}