#include <bits/stdc++.h>
using namespace std;
struct HPV{
int Len;
int A[905];
HPV(){
Len = 0;
memset(A, 0, sizeof(A));
}
void Read(){
string str;
int i;
cin >> str;
Len = str.size();
for (i = 1; i <= Len; i++)
A[i] = str[i - 1] - '0';
reverse(A + 1, A + Len + 1);
}
void Read(int x){
int i = 0;
while (x){
A[++i] = x % 10;
x /= 10;
}
Len = i;
return;
}
void Read(string str){
int i;
Len = str.size();
for (i = 1; i <= Len; i++)
A[i] = str[i - 1] - '0';
reverse(A + 1, A + Len + 1);
}
void Out(){
int i;
for (i = Len; i >= 1; i--)
cout << A[i];
return;
}
HPV operator + (const HPV x) const
{
HPV Ans;
int i;
Ans.Len = max(Len, x.Len);
memset(Ans.A, 0, sizeof(Ans.A));
for (i = 1; i <= Ans.Len; i++){
Ans.A[i] += A[i] + x.A[i];
if (Ans.A[i] > 9){
Ans.A[i + 1]++;
Ans.A[i] %= 10;
}
}
while (Ans.A[Ans.Len + 1] > 0)
Ans.Len++;
return Ans;
}
void operator += (const HPV x)
{
HPV Ans;
for (int i = 1; i <= Len; i++)
Ans.A[i] = A[i];
Ans.Len = Len;
Ans = Ans + x;
for (int i = 1; i <= Ans.Len; i++)
this -> A[i] = Ans.A[i];
this -> Len = Ans.Len;
return;
}
HPV operator - (const HPV x) const
{
HPV Ans;
int i;
Ans.Len = max(Len, x.Len);
memset(Ans.A, 0, sizeof(Ans.A));
for (i = 1; i <= Ans.Len; i++){
Ans.A[i] = A[i] - x.A[i];
if (Ans.A[i] < 0){
Ans.A[i + 1]--;
Ans.A[i] += 10;
}
}
while (Ans.A[Ans.Len] == 0)
Ans.Len--;
return Ans;
}
void operator -= (const HPV x)
{
HPV Ans;
for (int i = 1; i <= Len; i++)
Ans.A[i] = A[i];
Ans.Len = Len;
Ans = Ans - x;
for (int i = 1; i <= Ans.Len; i++)
this -> A[i] = Ans.A[i];
this -> Len = Ans.Len;
return;
}
HPV operator * (const HPV x) const
{
HPV Ans;
int i, j;
Ans.Len = Len + x.Len;
memset (Ans.A, 0, sizeof(Ans.A));
for (i = 1; i <= Len; i++)
for (j = 1; j <= x.Len; j++)
Ans.A[i + j - 1] += A[i] * x.A[j];
for (i = 1; i <= Ans.Len; i++)
if (Ans.A[i] > 9){
Ans.A[i + 1] += Ans.A[i] / 10;
Ans.A[i] %= 10;
}
while (Ans.A[Ans.Len] == 0)
Ans.Len--;
return Ans;
}
void operator *= (const HPV x)
{
HPV Ans;
for (int i = 1; i <= Len; i++)
Ans.A[i] = A[i];
Ans.Len = Len;
Ans = Ans * x;
for (int i = 1; i <= Ans.Len; i++)
this -> A[i] = Ans.A[i];
this -> Len = Ans.Len;
return;
}
void operator = (const string str)
{
this -> Read(str);
return;
}
void operator = (const int x)
{
this -> Read(x);
return;
}
int operator > (const HPV x) const
{
int i;
if (Len > x.Len)
return 1;
if (Len < x.Len)
return 0;
for (i = Len; i >= 1; i--){
if (A[i] > x.A[i])
return 1;
if (A[i] < x.A[i])
return 0;
}
return 0;
}
HPV operator / (const HPV x) const
{
HPV cn, c;
cn = 1;
c = 0;
HPV Ans, Ans2;
Ans2 = 0;
for (int i = 1; i <= Len; i++)
Ans.A[i] = A[i];
Ans.Len = Len;
while (Ans > c){
Ans -= x;
Ans2 += cn;
}
return Ans2;
}
};
typedef struct _InHpv{
void operator >> (HPV & x) const
{
x.Read();
return;
}
} InHpv;
InHpv hin;
typedef struct _OutHpv{
void operator << (HPV x) const
{
x.Out();
return;
}
} OutHpv;
OutHpv hout;