#include <iostream>
#include <cstring>
#include <algorithm>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctime>
#include <cstdlib>
using namespace std;
void gen_vect(vector<int>& vec,int n)
{
while(n--)
vec.push_back(rand());
}
bool cmp_up(const int& a,const int& b)
{
return a<b;
}
bool cmp_lower(const int& a, const int& b)
{
return a>b;
}
void gen_set(set<int>& s, int n)
{
while(n--) s.insert(rand()%15);
}
typedef long long ll;
ll trav(int n){
if(n==0) return 1;
else if(n<=2) return n;
return n*trav(n-1);
}
void add(vector<int>& ans,const vector<int>& a,const vector<int>& b)
{
ans.clear();
ans.resize(a.size()+b.size());
for(int i=0;i<ans.size();++i) ans[i]=0;
int pa(a.size()-1),pb(b.size()-1);
int p(0),n(0);
while(pa>=0&&pb>=0){
ans[p]+=a[pa]+b[pb];
int kn=ans[p];
int t(p);
while(ans[t]>=10){
ans[t++]%=10;
ans[t]+=1;
}
if(t>n) n=t;
pb--;
pa--;
p++;
}
if(pa>=0)
while(pa>=0){
ans[p]+=a[pa];
int nk=ans[p];
int t(p);
while(ans[t]>=10){
ans[t++]%=10;
ans[t]+=1;
}
if(t>n) n=t;
p++;
pa--;
}
if(pb>=0)
while(pb>=0){
ans[p]+=b[pb];
int nk=ans[p];
int t(p);
while(ans[t]>=10){
ans[t++]%=10;
ans[t]+=1;
}
if(t>n) n=t;
p++;
pb--;
}
for(int i=n;i>=0;--i) cout<<ans[i];
cout<<endl;
return;
}
/*
大数减法 123 - 234
if a<b then 标记负,算b-a
else 每一位
if 够减 then 相减
else 借位 then 3-4+10 and 高位-1(while调整)
*/
bool operator<(const vector<int>& a,const vector<int>& b){
if(a.size()<b.size()) return true;
else if(a.size()>b.size()) return false;
int len=a.size();
for(int i=0;i<len;++i){
int t1=a[i],t2=b[i];
if(a[i]<b[i]) return true;
else if(a[i]>b[i]) return false;
else continue;
}
return false;
}
void del(vector<int>& ans, vector<int> a,vector<int> b){
ans.clear();
bool flag(true);
if(a<b){
flag=false;
vector<int> tp=a;
a=b;
b=tp;
}
int pa(a.size()-1),pb(b.size()-1);
int p(0),borrow(0);
while(pb>=0&&pa>=0){
int tmp= a[pa]-b[pb]-borrow; //可能不够减
int z1=a[pa],z2=b[pb];
if(tmp<0) {ans[p]=tmp+10;borrow=1;}
else {ans[p]=tmp; borrow=0;}
//adjust
/*int t(pa);
while(tmp<0){
t--;
a[t]--;
tmp=a[t];
}*/
pa--;
pb--;
p++;
}
while(pa>=0){
if(borrow) {ans[p]=a[pa]-borrow;borrow=0;}
else ans[p]=a[pa];
p++;
pa--;
}
if(!flag) cout<<'-';
bool zero(false);
for(int i=p-1;i>=0;--i){
if(ans[i]!=0||zero)
{
cout<<ans[i];
if(!zero) zero=true;
}
}
cout<<endl;
}
/*大数乘法
123*123
3*3+3*2*10*3+1*100*3
2*...
从a.size()-1 ~ 0
b.size()-1 ~ 0 每移动一位都使得base+1,即ans[i+base]=out;
并且对ans[i]进行向上调整 while(a[i]>9)
*/
void multi(vector<int>& ans,vector<int> a,vector<int> b){
//initial
ans.clear();
ans.resize(a.size()+b.size()+1);
for(int i=0;i<ans.size();++i) ans[i]=0;
int p(0),n(0);
int pa(a.size()-1),pb(b.size()-1);
for(int i=pa,basA=0;i>=0;i--,basA++){
for(int j=pb,basB=0;j>=0;j--,basB++){
int bas=basA+basB;
int tp = a[i]*b[j];
ans[bas]+= tp;
int t(bas);
while(ans[t]>9){
int ent=ans[t]/10;
ans[t]%=10;
t++;
ans[t]+=ent; //forward regregation
}
if(t>n) n=t;
p++; //每一轮次后增长一个数量级
}
}
bool zero(false);
for(int i=n;i>=0;--i){
if(ans[i]!=0||zero)
{
cout<<ans[i];
if(!zero) zero=true;
}
}
cout<<endl;
}
int main()
{
string a,b;
vector<int> ans,A, B;
while(cin>>a>>b){
//转换为数字
for(int i=0;i<a.size();++i) A.push_back(a[i]-'0');
for(int i=0;i<b.size();++i) B.push_back(b[i]-'0');
add(ans,A,B);
del(ans,A,B);
multi(ans,A,B);
ans.clear();
A.clear();
B.clear();
}
return 0;
}