题目:爱买手办的张三
来源: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; }