您的位置:首页 > 其它

【BZOJ 1192】[HNOI2006]鬼谷子的钱袋

2018-03-18 19:30 246 查看

【链接】 我是链接,点我呀:)
【题意】


在这里输入题意

【题解】


设k为最大的正整数满足
\(2^0+2^1+...+2^k<=m\)
如果\(m>2^0+2^1+...+2^k\)
那么只用\(2^0,2^1,...2^k\)和\(m-(2^0+2^1+...+2^k)\)这k+2个数就能表示出0..m这m+1个数字了。
(原理自己想
(不过我还不是很明白那个\(m-(2^0+2^1+...+2^k)\)是否会和前面的2次方数字重复
(不过因为AC了,所以肯定是不会重复了。那么就记住这个结论吧。
如果m=...
那么只用\(2^0,2^1,...2^k\)这k+1个数字就能表示0..m这m+1个数字了。

【代码】

#include <bits/stdc++.h>
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define all(x) x.begin(),x.end()
#define pb push_back
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using namespace std;

const double pi = acos(-1);
const int dx[4] = {0,0,1,-1};
const int dy[4] = {1,-1,0,0};

int m;

int main(){
#ifdef LOCAL_DEFINE
freopen("rush_in.txt", "r", stdin);
#endif
scanf("%d",&m);
int now = 1;
int cnt = 0;
while (now<=m){
cnt++;
m-=now;
now*=2;
}
if (m) cnt++;
printf("%d\n",cnt);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: