class long_int{
private:
size_t m_length;
int m_num[10005];
public:
long_int(){
memset(m_num,0,sizeof(m_num));
m_length=1;
}
long_int(size_t x,bool flag){
if(flag){
memset(m_num,0,sizeof(m_num));
m_length=x;
}
else{
string str;
while(x){
str+=(x%10)+'0';
x/=10;
}
for(int i=0;i<str.length();i++){
m_num[i]=str[i]-'0';
}
m_length=str.length();
}
}
void Measure_size(){
for(int i=0;i<10005;i++){
if(m_num[i]){
m_length=i;
}
}
m_length++;
}
void print_sys(){
for(int i=0;i<m_length;i++){
cout<<m_num[i];
}
cout<<endl;
}
size_t size(){
return m_length;
}
size_t length(){
return m_length;
}
bool operator<(long_int b){
for(int i=max(m_length,b.length());i>-1;i--){
if(m_num[i]>b[i]){
return false;
}
if(m_num[i]<b[i]){
return true;
}
}
return false;
}
int operator[](int __index__){
return m_num[__index__];
}
long_int operator*(long_int b){
long_int res(m_length+b.length(),1);
for(int i=0;i<m_length+b.length()-1;i++){
for(int j=0;j<=i;j++){
res.m_num[i]+=m_num[j]*b[i-j];
}
res.m_num[i+1]+=res.m_num[i]/10;
res.m_num[i]%=10;
}
res.Measure_size();
return res;
}
void operator=(int x){
string str;
while(x){
str+=(x%10)+'0';
x/=10;
}
for(int i=0;i<str.length();i++){
m_num[i]=str[i]-'0';
}
m_length=str.length();
}
void operator=(string str){
for(int i=0;i<str.length();i++){
m_num[i]=str[str.length()-i-1]-'0';
}
m_length=str.length();
}
friend ostream& operator<<(ostream& out_put__,long_int& out_num){
for(int i=out_num.length()-1;i>-1;i--){
out_put__<<out_num[i];
}
return out_put__;
}
};
long_int max_(long_int a,long_int b){ return a<b?b:a; }
