本题主要是对位运算和二进制要有所理解
AC代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=1e6+5;
struct node{
int num,low;
}s[maxn];
int getlow(int x){
int a=0;
while(x){
if(x&1)return 1<<a;//奇数的最后一位一定是1
x=x/2;
a++;//偶数每次除2对于二进制而言就相当于左移一位,去一个零
}
return 0;
}
int cmp(node a,node b){
return a.low>b.low;
}
int a[maxn],ans[maxn];
int main(){
int sum,n;
cin>>sum>>n;
for(int i=1;i<=n;i++){
s[i].num=i;
s[i].low=getlow(i);
}
sort(s+1,s+1+n,cmp);
int cnt=0;
for(int i=1;i<=n;i++){
if(s[i].low<=sum){
sum-=s[i].low;
ans[++cnt]=s[i].num;
}
if(sum==0)break;
}
sort(ans+1,ans+1+cnt);
if(sum!=0)cout<<-1<<endl;
else{
cout<<cnt<<endl;
for(int i=1;i<=cnt;i++)
cout<<ans[i]<<" ";
}
cout<<endl;
}