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?
The first line contains two integers: sum, limit (1 ≤ sum, limit ≤ 105).
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.
5 5
2 4 5
4 3
3 2 3 1
5 1
-1
In sample test 1: lowbit(4) = 4, lowbit(5) = 1, 4 + 1 = 5.
In sample test 2: lowbit(1) = 1, lowbit(2) = 2, lowbit(3) = 1, 1 + 2 + 1 = 4.
题目大意:给在[1,limit]得到一些数使得他们的二进制,从高位到低位第一个 1 出
现的位置的和等于 sum
数据范围:sum, limit (1 ≤ sum, limit ≤ 100000)
解题思路:考虑到数目不是太大的情况下,先是将[1,limit]范围内的每个数求一下转换为二进制的时候第一个 1 的位置,然后再遍历一遍他们相加是否为 sum,之后比较综合是否为 sum,是则输出个数和具体数字,不是则输出-1
在这之中,有一个新的方法更方便的去转换 bitset 类去取二进制在代码中先是添加头文件#include <bitset>
然后在代码中的体现是这个 bitset<18> t; //声明一个含有 18 位的 t 二进制数组
t = i;//将循环的每个数 i 传递给 t
string str;//string 类
str = t.to_string();//bitset 类成员函数 to_string(),作用是将 t 转化成一个二进制的字符串
#include<iostream>
#include<cstring>
#include<cstdio>
#include<climits>
#include<cmath>
#include <bitset>
#include<algorithm>
using namespace std;
int sum, limit, i, ans, k,x,n,j;
int a[100008];
int c[100008];
int main()
{
cin >> sum >> limit;
ans = 0;
k = 0;
memset(a, 0, sizeof(a));
memset(c, 0, sizeof(c));
for (i = limit; i >= 1; i--)
{
bitset<18> t;
t = i;
string str;//string类
str = t.to_string();//bitset类成员函数to_string()
for (j = 1; j <= 18; j++)
{
if (str[j] == '1')
{
break;
}
}
x = j;
for (j = 17; j >= x; j--)
{
if (str[j] == '1')
{
c[i] = pow(2, 17-x+1-(j-x+1));
break;
}
}
}
for (i = limit; i >= 1; i--)
{
ans += c[i];
if (ans > sum)
{
ans -= c[i];
}
else if (ans == sum)
{
a[i] = 1;
k++;
break;
}
else
{
a[i] = 1;
k++;
}
}
j = 0;
if (ans == sum)
{
cout << k << endl;
for (i = 1; i <= limit; i++)
{
if (a[i] == 1)
{
j++;
if (j == k)
{
cout << i << endl;
break;
}
else
{
cout << i << " ";
}
}
}
}
else
{
cout << -1 << endl;
}
}