The Child and Set
At the children’s day, the child came to Picks’s house, and messed his house up. Picks was angry at him. A lot of important things were lost, in particular the favorite set of Picks.
Fortunately, Picks remembers something about his set S:
its elements were distinct integers from 1 to limit;
the value of was equal to sum; here lowbit(x) equals 2k where k is the position of the first one in the binary representation of x. For example, lowbit(100102) = 102, lowbit(100012) = 12, lowbit(100002) = 100002 (binary representation).
Can you help Picks and find any set S, that satisfies all the above conditions?
Input
The first line contains two integers: sum, limit (1 ≤ sum, limit ≤ 105).
Output
In the first line print an integer n (1 ≤ n ≤ 105), denoting the size of S. Then print the elements of set S in any order. If there are multiple answers, print any of them.
If it’s impossible to find a suitable set, print -1.
题目大意为求lowbit(1-limit)之间的和,是否可以组成sum;
lowbit(1-limit)的范围为:
1
10
100
1000
…
所以这道题可以转化为数sum是否可以由2的不同幂次方的数相加组成;
可以先贪心的把最大的2的幂次方数取完,然后依次取下去就行,直到sum为0;
代码:
#include<bits/stdc++.h>
#define ll long long
#define pa pair<int,int>
#define lson k<<1
#define rson k<<1|1
#define inf 0x3f3f3f3f
//ios::sync_with_stdio(false);
using namespace std;
const int N=100100;
const int M=1000100;
const ll mod=1e9+7;
set<int>se;
int main(){
ios::sync_with_stdio(false);
int sum,lim;
cin>>sum>>lim;
for(int i=16;i>=0;i--){
int a=(1<<i),b=(a<<1);
for(int j=a;j<=lim;j+=b){
if(sum>=a){
sum-=a;
se.insert(j);
}
}
}
if(sum) cout<<-1<<endl;
else{
cout<<se.size()<<endl;
set<int>::iterator it;
for(it=se.begin();it!=se.end();it++) cout<<*it<<" ";
}
return 0;
}