hdu 4588 Count The Carries 南京邀请赛
生活随笔
收集整理的這篇文章主要介紹了
hdu 4588 Count The Carries 南京邀请赛
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目意思:求a~b 之間數(shù)二進(jìn)制的和 求 ?進(jìn)了多少位。
比如 ?1~3 ? ? 01+10+11=22 ? 22->30->110 進(jìn)了 2位
要尋找規(guī)律,發(fā)現(xiàn) ?加到3的時(shí)候?yàn)?2 ?加到7的時(shí)候?yàn)?44 ?猜測(cè)下 ?加到15的時(shí)候?yàn)?888這樣就找到規(guī)律了 ?2^p-1
之后 只要whlle一下就好了
還有本題用long long的話 會(huì)答案錯(cuò)誤,用_int64會(huì)正確。
#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);} }
總結(jié)
以上是生活随笔為你收集整理的hdu 4588 Count The Carries 南京邀请赛的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: poj 1830 开关问题
- 下一篇: poj 2492 A Bug's Lif