您的位置:首页 > 其它

uva11645 Bits(数位统计)

2015-05-12 01:23 405 查看
题意:统计1-n的所有二进制表示中”11”出现的次数

解法:与统计k进制中x出现的次数方法类似

注:此题结束输入的方式是输入一个负数,而不是-1,一开始没仔细看题目描述,判断条件出错,无限TLE…

#include <stdio.h>
#include <string.h>
#include <set>
#include <map>
#include <algorithm>
#include<vector>
#include<complex>
#include<iostream>
#define ll long long
const ll rad=10000;
using namespace std ;

struct bint{
ll v[100],l;
bint(){
l=1;v[1]=0;
}
};

inline bint operator+(bint a,bint b){
if(a.l<b.l) swap(a,b);
ll t=b.l;
for(ll i=1;i<=t;i++) a.v[i]+=b.v[i];
for(ll i=1;i<=t;i++){
if(a.v[i]>=rad){
if(i==a.l) a.v[i+1]=0,a.l++;//***
a.v[i+1]+=(a.v[i]/rad);
t=max(t,i+1);
a.v[i]%=rad;
}
}
return a;
}

inline bint operator+(bint a,ll p){
bint b;
b.v[1]=p,b.l=1;
return a+b;
}

int cas;
ll n;
ll last,now,l,r,base;

void print(bint a){
printf("%lld",a.v[a.l]);
for(ll i=a.l-1;i>=1;i--) printf("%04lld",a.v[i]);
printf("\n");
}
bint ans;

int main(){
cas=0;
//freopen("a.txt","r",stdin);
//freopen("b.txt","w",stdout);
while(scanf("%lld",&n)!=EOF){
if(n<0) break;
ans.v[1]=0,ans.l=1;
last=0,now=0;
r=0,l=n,base=1;
last=l%2; l>>=1;
while(l){
now=l%2;
l>>=1;
if(now==1&&last==1){
ans=((ans+l*base)+(r+1));
}
else{
ans=(ans+(l*base));
}
r=r+last*base;
base<<=1;
last=now;
}
printf("Case %d: ",++cas);
print(ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: