當前位置:
首頁 >
hdu 4588 Count The Carries 南京邀请赛
發布時間:2024/2/28
40
豆豆
生活随笔
收集整理的這篇文章主要介紹了
hdu 4588 Count The Carries 南京邀请赛
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目意思:求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);} }
總結
以上是生活随笔為你收集整理的hdu 4588 Count The Carries 南京邀请赛的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: poj 1830 开关问题
- 下一篇: poj 2492 A Bug's Lif