Codeforces Round #250 (Div. 2) -B. The Child and Set
2014-08-04 17:55
627 查看
B. The Child and Set
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
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.
Sample test(s)
input
output
input
output
input
output
Note
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.
思路:从limit开始枚举到1找出能被sum减去的lowbit sum值减去lowbit 并且把lowbit对应的i值存入数组a, 看最后sum是否为0 ,是的话就输出数组a 其他输出-1,
一个数x的lowbit等于 x&(-x);
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[100006];
int getlowbit(int x){
return x&(-x);
}
int main(){
int sum,limit;
int i,k,j;
while(scanf("%d %d",&sum,&limit)!=EOF){
j=0;
memset(a,0,sizeof(a));
for(i=limit;i>=1;i--){
k=getlowbit(i);
if(sum>=k){
a[j++]=i;
sum-=k;
}
}
if(sum==0){
printf("%d\n",j);
for(i=0;i<j-1;i++)
printf("%d ",a[i]);
printf("%d\n",a[i]);
}else{
printf("-1\n");
}
}
return 0;
}
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
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.
Sample test(s)
input
5 5
output
2 4 5
input
4 3
output
3 2 3 1
input
5 1
output
-1
Note
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.
思路:从limit开始枚举到1找出能被sum减去的lowbit sum值减去lowbit 并且把lowbit对应的i值存入数组a, 看最后sum是否为0 ,是的话就输出数组a 其他输出-1,
一个数x的lowbit等于 x&(-x);
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[100006];
int getlowbit(int x){
return x&(-x);
}
int main(){
int sum,limit;
int i,k,j;
while(scanf("%d %d",&sum,&limit)!=EOF){
j=0;
memset(a,0,sizeof(a));
for(i=limit;i>=1;i--){
k=getlowbit(i);
if(sum>=k){
a[j++]=i;
sum-=k;
}
}
if(sum==0){
printf("%d\n",j);
for(i=0;i<j-1;i++)
printf("%d ",a[i]);
printf("%d\n",a[i]);
}else{
printf("-1\n");
}
}
return 0;
}
相关文章推荐
- Codeforces Round #250 (Div. 2)——The Child and Set
- Codeforces #250 (Div. 2) B. The Child and Set
- codeforces --- Round #250 (Div. 2) B. The Child and Set
- Codeforces Round #250 (Div. 2)——The Child and Set
- Center parent div with dynamic and set width child divs
- Codeforces Round #250 (Div. 2) C. The Child and Toy 详解
- G - The Child and Set-CodeForces 437B-水题
- Codeforces Round #250 (Div. 1) A. The Child and Toy
- Codeforces Round #250 (Div. 2) C、The Child and Toy
- Codeforces Round #250 (Div. 1) D. The Child and Sequence 线段树 区间取摸
- Codeforces Round #250 (Div. 2) -C. The Child and Toy
- Codeforces Round #250 (Div. 2) A. The Child and Homework
- Codeforces Round #250 (Div. 2) A - The Child and Homework
- Codeforces Round #250 (Div. 1) B. The Child and Zoo(排序+并查集)(常规好题)
- Codeforces Round #250 (Div. 1) D. The Child and Sequence 线段树 区间求和+点修改+区间取模
- Codeforces Round #250 (Div. 1) D. The Child and Sequence
- Codeforces Round #250 Div. 2(C.The Child and Toy)
- Codeforces div.2 B. The Child and Set
- Codeforces #250 (Div. 2) C.The Child and Toy
- Codeforces Round #250 (Div. 2) A - The Child and Homework