HDU 4588Count The Carries

来源:互联网 发布:手机淘宝不能登录原因 编辑:程序博客网 时间:2024/06/06 19:29

题意:询问从a加到b 二进制进位的次数

思路:

枚举二进制,有x个1 则在当前位上有x/2个进位,对前一位的贡献是x/2

#include<stdio.h>#include<cstring>using namespace std;typedef long long ll;ll a[100][3];ll solve(ll k, int q){if(k <= 0) return 0;k++;ll ans = 0, p = 0, i;for(i = 0; k >= (1 << i); i++){ll t = k / (1 << (i + 1)) * (1 << (i)); ll tmp = k % (1 << (i + 1));if(tmp > (1 << i)) t += tmp - (1 << i);a[i][q] = t;}return ans;}int main(){ll x, b;while(~scanf("%lld%lld",  &x, &b)){memset(a, 0, sizeof(a));ll ans = 0, p = 0;solve(b, 1);solve(x - 1, 2);for(int i = 0; i <= 64; i++){ans += (a[i][1] - a[i][2] + p) / 2;p = (a[i][1] - a[i][2] + p) / 2;}printf("%lld\n", ans);}return 0;}


原创粉丝点击