题目:爱买手办的张三
来源:2020年第十四届山东大学程序设计竞赛(重现赛)
解题思路
题目要求:给定非负整数 ,
。
求 的最小值,并递增列出
;求
的最大值,并递增列出
,其中
。
显然,,
。
将 用二进制表示,
为 0 的位置上
在该位置必须为 0,
为 1 的位置上
在该位置可以是 1 或者 0。
所以,求出 的二进制表示有
个 1,
。
C++代码
#include<iostream>
#include<bitset>
#include<vector>
#include<cmath>
using namespace std;
int main(){
int Y;
cin >> Y;
cout << 1 << endl;
cout << Y << endl;
bitset<32> y(Y);
int k = y.count();
cout << pow(2, k) << endl;
cout << 0 << endl;
vector<int> cnt;
for(int i=0; i<32; ++i){
int sum = 0;
if(y[i] == 1){
sum += pow(2, i);
cout << sum << endl;
int n = cnt.size();
cnt.push_back(sum);
for(int j=0; j<n; ++j){
cnt.push_back(sum + cnt[j]);
cout << cnt.back() << endl;
}
}
}
return 0;
}

京公网安备 11010502036488号