763

#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;
}

 

Leave a Reply

Your email address will not be published. Required fields are marked *