uva11645 Bits(数位统计)
2015-05-12 01:23
405 查看
题意:统计1-n的所有二进制表示中”11”出现的次数
解法:与统计k进制中x出现的次数方法类似
注:此题结束输入的方式是输入一个负数,而不是-1,一开始没仔细看题目描述,判断条件出错,无限TLE…
解法:与统计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; }
相关文章推荐
- uva11645 - Bits 统计 巧妙的大数
- uva 11645 Bits
- uva11361 - Investigating Div-Sum Property 数位统计DP
- UVa 11645 Bits(计数原理+高精度)
- UVA 11038 How Many O's? (数位统计 )
- UVa 11038 - How Many O's? (组合数学 数位统计)
- UVA11645 Bits【位运算+大数】
- Uva 11645 - Bits 解题报告(递推+大数)
- UVa1640 - The Counting Problem(数位统计)
- uva 1640 The Counting Problem (数位dp||统计0-9的个数)
- UVA11645:Bits
- uva1640(数位统计)
- UVA1640 数位统计
- UVA 11645 Bits
- UVA - 11645 Bits
- UVa11645 - Bits(递推+高精度)
- UVA 1225 Digit Counting(统计数位出现的次数)
- UVA 1640(数位统计)
- UVA 11645 - Bits(数论+计数问题)
- 【数论-数位统计】UVa 11076 - Add Again