原題連結
題解
已知對於一個長度為 \(n\) 的連續+1型上升序列而言,其滿足要求的子序列有\(2^n\)個
若我們在該序列下標為 \(k\) 的右邊插入一個絕對大於左邊,絕對小於右邊的數,滿足要求的子序列會增加 \(2^k\) 個
由此想到極限構造加二進位制,其中最高位的一不用管,其餘的每一位生成上升序列,如果有一就在生成前插入
注意細節!!
code
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
ll n;
cin>>n;
queue<ll> q;
int l=-1e9,r=1e9;
ll len=0;
while(n>1)
{
q.push(n%2);
len+=1+n%2;
n/=2;
}
cout<<len<<endl;
while(q.size())
{
if(q.front()==1) cout<<r--<<" ";
cout<<l++<< " ";
q.pop();
}
puts("");
}
return 0;
}