You are given a positive integer n๐. Find the longest sequence of positive integers a=[a1,a2,โฆ,ak]๐=[๐1,๐2,โฆ,๐๐] that satisfies the following conditions, and print the sequence:
aiโคn๐๐โค๐ for all 1โคiโคk1โค๐โค๐.
a๐ is strictly increasing. That is, ai>aiโ1๐๐>๐๐โ1 for all 2โคiโคk2โค๐โค๐.
aiโฃaiโ1=n๐๐|๐๐โ1=๐ for all 2โคiโคk2โค๐โค๐, where โฃ| denotes the .
Input
Each test contains multiple test cases. The first line contains the number of test cases t๐ก (1โคtโค10001โค๐กโค1000). Description of the test cases follows.
The only line of each test case contains one integer n๐ (1โคnโค10181โค๐โค1018).
It's guaranteed that the sum of lengths of the longest valid sequences does not exceed 5โ 1055โ 105.
Output
For each testcase, print two lines. In the first line, print the length of your constructed sequence, k๐. In the second line, print k๐ positive integers, denoting the sequence. If there are multiple longest sequences, you can print any of them.
ExampleinputCopy
4131423
outputCopy
1
1
3
1 2 3
4
4 10 12 14
5
7 18 21 22 23
Intuition
Check Initially
If
// 23
// 10111
// 00101 5
// 10010 18
// 10101 21
// 10110 22
// 10111 23
If in 5 we put 1 initially, then we will have to put one in 18 also
Due to sum condition
So like that we generate the nums,
We get a alternating pattern
Code is difficult refer it
Links
Video Links
Approach 1:
C++
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
while(t--){
int n;
cin>>n;
if(__builtin_popcountll(n) == 1){
cout<<"1\n"<<n<<endl;
continue;
}
int res = __builtin_popcountll(n) + 1;
cout<<res<<endl;
// 23
// 10111
// 00101 5
// 10010 18
// 10101 21
// 10110 22
// 10111 23
for(int i=0; i<res; i++){
int cnt = 0, cur = 0;
int val = 0;
for(int l = 64; l>=0; l--){
if(n & (1ll<<l)){
cnt ++;
/*
Basically, Only i ones will get printed,
When i = 0
Initial ones not printed,
When i = 1, only initial one printed, then alternating because of curr
For zero we just ignore
Only at one we do alternating
Refer Explanation for more
*/
if(cnt <= i)
val += (1ll<<l);
else{
if(cur)
val += (1ll<<l);
cur = 1-cur;
}
}
}
cout<<val<<" ";
}
cout<<endl;
}
}