CodeForces - 437 B

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值