知道求lowbit的公式后,直接把所有lowbit排个序,从大到小选就好了
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
struct node
{
int lb;
int num;
}
tm[100000+5];
int vis[100000+5];
int cmp(node a,node b)
{
return a.lb>b.lb;
}
inline int lowbit(__int64 x)
{
return x&-x;
}
int main()
{
int i;
int sum,limit;
cin>>sum>>limit;
for (i=1;i<=limit;i++)
{
tm[i].num=i;
tm[i].lb=lowbit(i);
}
sort(tm+1,tm+1+limit,cmp);
int ok=0;
for (i=1;i<=limit;i++)
{
if (sum>=tm[i].lb)
{
vis[++ok]=tm[i].num;
sum-=tm[i].lb;
if (sum==0) break;
}
}
if (sum!=0)
{
printf("-1\n");
return 0;
}
printf("%d\n",ok);
for (i=1;i<=ok;i++)
{
if (i!=1) printf(" ");
printf("%d",vis[i]);
}
printf("\n");
return 0;
}