#include <iostream> #include <string> #include <stdio.h> #include <string.h> #define max(a,b) (a)>(b)?(a):(b) #define size 350 using namespace std; struct bignum{ int s[size]; int len; bignum() { len = 1; memset(s,0,sizeof(s)); } bignum operator = (const char *str) { len = strlen(str); for(int i= 0;i<len;i++) { s[len-1-i] = str[i]-'0'; } return *this; } bignum operator = (const int num) { char ch[300]; sprintf(ch,"%d",num); *this = ch; return *this; } bignum(const char *str) { *this = str; } bignum(const int num) { *this = num; } bignum operator +(const bignum &big) { bignum sum; sum.len = max(this->len,big.len);//((this->len) >= (big.len) ? (this->len) : (big.len) ); int tmp=0; for(int i=0;i<sum.len;i++) { if(i<this->len) tmp+=this->s[i]; if(i<(big.len)) tmp+=(big.s[i]); sum.s[i] = tmp%10; tmp/=10; } while(tmp) { sum.s[sum.len++] = tmp%10; tmp/=10; } return sum; } bignum operator -(const bignum &big) { bignum sub; sub.len = ((this->len) >= (big.len) ? (this->len) : (big.len) ); int i=0; for(i=0;i<big.len;i++) { if((this->s[i])<big.s[i]) { this->s[i]+=10; this->s[i+1]--; } sub.s[i] = (this->s[i])-big.s[i]; } for(;i<(this->len);i++) { if(this->s[i]<0) { this->s[i]+=10; this->s[i+1]--; } sub.s[i]=this->s[i]; } while(sub.s[sub.len-1]==0) { sub.len--; } if(sub.len==0) sub.len=1; return sub; } bool operator <(const bignum &b)const { if((this->len)!=b.len) return (this->len) < b.len; for(int i=len-1;i>=0;i--) { if(this->s[i]!=b.s[i]) return this->s[i] < b.s[i]; } return false; } bool operator >(const bignum &b)const{ return b < *this;} bool operator <=(const bignum &b)const{return !(b<(*this));} bool operator >=(const bignum &b)const{return !((*this)<b);} bool operator !=(const bignum &b)const{return (b<(*this)) || (((*this)<b));} bool operator ==(const bignum &b)const{return !(b!=*this);} void prnt() { if(len==1 && s[0]==0) printf("0"); else { for(int i=len-1;i>=0;i--) printf("%d",s[i]); } cout<<"\n"; } }; bignum fib[120]; bignum res,zero; void solve(int index) { int flag=1; for(int i=index;i>=1;i--) { if(res>=fib[i] && flag) { printf("1"); res = res - fib[i]; flag=0; } else { printf("0"); flag = 1; } } } int main() { /*string number; int num=40; sprintf(number, "%d", num); printf("%s\n",number); */ int kase=0; fib[1]="1"; fib[2]="2"; for(int i=3;i<120;i++) fib[i]= fib[i-1]+fib[i-2]; char s1[300],s2[300]; bignum sum,sum1; while(~scanf("%s%s",s1,s2)) { sum ="0"; sum1 ="0"; res="0"; if (kase ++) { printf("\n"); } for(int i=strlen(s1)-1;i>=0;i--) { if(s1[i]=='1') { sum= sum +fib[strlen(s1)-i]; } } for(int i=strlen(s2)-1;i>=0;i--) { if(s2[i]=='1') sum1=sum1 + fib[strlen(s2)-i]; } res =sum+sum1; if(res==zero) { cout<<"0\n"; continue; } else { int ind,pos; for(ind=120-1;ind>=1;ind--) { if(res>=fib[ind]) { break; } } solve(ind); printf("\n"); } } return 0; }