hdu 4588 Count The Carries 南京邀请赛

来源:互联网 发布:模拟城市我是市长知乎 编辑:程序博客网 时间:2024/05/17 06:11

题目意思:求a~b 之间数二进制的和 求  进了多少位。

比如  1~3     01+10+11=22   22->30->110 进了 2位


要寻找规律,发现  加到3的时候为22  加到7的时候为444  猜测下  加到15的时候为8888这样就找到规律了  2^p-1

之后 只要whlle一下就好了

还有本题用long long的话 会答案错误,用_int64会正确。

#include <iostream>#include <cstdio>#include<cstring>#include<algorithm>using namespace std;__int64 ans[1000];__int64  int anum[1000];__int64 int bnum[1000];void cal(__int64 x,__int64  a[]){    int p=30,i;    while(x>0){        while(x<((1<<p)-1))            p--;        for(i=0;i<p;i++) a[i]+=1<<(p-1);        a[p]+=x+1-(1<<p);        x-=1<<p;    }}int main(){    __int64  a,b;    while(scanf("%I64d%I64d",&a,&b)!=EOF){        int i;        memset(ans,0,sizeof(ans));        memset(anum,0,sizeof(anum));        memset(bnum,0,sizeof(bnum));        cal(a-1,anum);        cal(b,bnum);        for(i=0;i<=50;i++)            ans[i]=bnum[i]-anum[i];       __int64  anstime=0;        for(i=0;i<=50;i++){            anstime+=ans[i]>>1;            ans[i+1]+=ans[i]>>1;        }        printf("%I64d\n",anstime);    }}



原创粉丝点击