struct Bignum
{
typedef long long ll;
static const int BASE=100000000;
static const int WIDTH=8;
static const int maxn=5000+10;
ll num[maxn];
int len;
Bignum() {len=1,num[1]=0;}
Bignum(ll x)
{
len=0;
do
{
num[++len]=x%BASE;
x/=BASE;
}while(x);
}
static int max(int x,int y) {return x>y?x:y;}
void read()
{
char t[maxn];
scanf("%s",t+1);
int l=strlen(t+1);
len=(l-1)/WIDTH+1;
for (int i=1;i<=len;i++)
{
int end=l-(i-1)*WIDTH,start=max(1, end-WIDTH+1);
num[i]=0;
for (int j=start;j<=end;j++)
num[i]=num[i]*10+t[j]-'0';
}
}
void deleteZero()
{
while(len>1&&!num[len])
len--;
}
ll& operator [] (int i) {return num[i];}
Bignum friend operator + (Bignum a,Bignum b)
{
Bignum res;
res.len=max(a.len, b.len);
for (int i=1;i<=res.len;i++)
res[i]=0;
for (int i=1;i<=a.len;i++)
res[i]+=a[i];
for (int i=1;i<=b.len;i++)
res[i]+=b[i];
for (int i=1;i=BASE)
res[i+1]++,res[i]-=BASE;
if (res[res.len]>=BASE)
{
res[res.len+1]=1;
res[res.len]-=BASE;
res.len++;
}
return res;
}
Bignum friend operator - (Bignum a,Bignum b)
{
Bignum res;
res.len=max(a.len, b.len);
for (int i=1;i<=res.len;i++)
res[i]=0;
for (int i=1;i<=a.len;i++)
res[i]+=a[i];
for (int i=1;i<=b.len;i++)
{
res[i]-=b[i];
if (res[i]<0)
res[i]+=BASE,res[i+1]--;
}
res.deleteZero();
return res;
}
Bignum friend operator * (Bignum a,Bignum b)
{
Bignum res;
res.len=a.len+b.len;
for (int i=1;i<=res.len;i++)
res[i]=0;
for (int i=1;i<=a.len;i++)
for (int j=1;j<=b.len;j++)
{
res[i+j-1]+=a[i]*b[j];
if (res[i+j-1]>=BASE)
res[i+j]+=res[i+j-1]/BASE,res[i+j-1]%=BASE;
}
if (res[res.len]>=BASE)
{
res[res.len+1]=res[res.len]/BASE;
res[res.len]%=BASE;
res.len++;
}
res.deleteZero();
return res;
}
Bignum friend operator / (Bignum a,const ll b)
{
Bignum res=Bignum(0),base=Bignum(BASE);
ll last=0;
for (int i=a.len;i>=1;i--)
{
last=last*BASE+a[i];
res=res*base+Bignum(last/b);
last%=b;
}
return res;
}
Bignum friend operator % (Bignum a,const ll b) {return a-a/b*b;}
Bignum operator += (Bignum b) {return *this=*this+b;}
Bignum operator -= (Bignum b) {return *this=*this-b;}
Bignum operator *= (Bignum b) {return *this=*this*b;}
Bignum operator /= (const ll b) {return *this=*this/b;}
void print()
{
printf("%lld",num[len]);
for (int i=len-1;i>=1;i--)
printf("%08lld",num[i]);
}
};