点击这里查看原题
读入n,转为2进制,每次记录(x,x+1)两个值,如果当前位为1,转化为(2x+1,2x+2),否则转化为(2x,2x+1)(用二进制来表示x就是n的当前位为1,则在x后面添1,否则添0),即可得到
an
的值
高精度细节很多,要小心
/*
User:Small
Language:C++
Problem No.:2656
*/
#include<bits/stdc++.h>
#define ll long long
#define inf 999999999
using namespace std;
const int M=5005;
struct bignum{
int num[M],len;
bignum(int a=0){*this=a;}
void clear(){
memset(num,0,sizeof(num));
len=0;
}
int& operator[](int x){
return num[x];
}
bignum operator=(const char *s){
clear();
len=strlen(s+1);
for(int i=1;i<=len;i++) num[i]=s[len+1-i]-'0';
return *this;
}
bignum operator=(int x){
clear();
for(;x;x/=10){
num[++len]=x%10;
}
if(!len) len++;
return *this;
}
bool operator<(const bignum b)const{
if(len!=b.len) return len<b.len;
for(int i=len;i;i--){
if(num[i]!=b.num[i]) return num[i]<b.num[i];
}
return 0;
}
bool operator>(const bignum b)const{
return b<*this;
}
void modify(){
int x=0,i=1;
for(;x||i<=len;i++){
x+=num[i];
num[i]=x%10;
x/=10;
}
len=max(len,i-1);
for(;!num[len]&&len>1;len--);
}
void print(){
for(int i=len;i;i--) printf("%d",num[i]);
printf("\n");
}
}a,b;
bignum operator+(bignum a,bignum b){
bignum c;
c.clear();
c.len=max(a.len,b.len);
for(int i=1;i<=c.len;i++){
c[i]=a[i]+b[i];
}
c.modify();
return c;
}
bignum operator/(bignum a,int b){
bignum c;
c.clear();
int x=0;
for(int i=a.len;i;i--){
x=x*10+a[i];
if(x<b) continue;
c[i]=x/b;
x%=b;
if(!c.len) c.len=i;
}
if(!c.len) c.len=1;
return c;
}
int n,bi[M],len;
char s[M];
void solve(){
scanf("%s",s+1);
a=s;
len=0;
while(a>0){
bi[++len]=a[1]&1;
a=a/2;
}
a=0;
b=1;
for(int i=len;i;i--){
if(bi[i]) a=a+b;
else b=a+b;
}
a.print();
}
int main(){
freopen("data.in","r",stdin);//
int t;
scanf("%d",&t);
while(t--) solve();
return 0;
}