高%单,高*单,高/单,高*高,高-高,高+高
#include<algorithm>
#include<cstring>
#include<cstdio>
#define N 1020000
using namespace std;
typedef long long LL;
struct Bigint{
int a[N],len;
bool flag;
Bigint(){memset(a,0,sizeof a);len=1;flag=true;}
void clear(){memset(a,0,sizeof a);len=1;flag=true;}
bool operator == (const Bigint b) const{
if(flag!=b.flag || len!=b.len) return false;
for(int i=1;i<=len;i++)
if(a[i]!=b.a[i]) return false;
return true;
}
bool operator > (const Bigint b) const{
if(flag!=b.flag){
if(!flag) return false;
if(flag) return true;
}
if(flag){
if(len>b.len) return true;
if(len<b.len) return false;
for(int i=len;i>=1;i--){
if(a[i]>b.a[i]) return true;
if(a[i]<b.a[i]) return false;
}
return false;
}
else{
if(len>b.len) return false;
if(len<b.len) return true;
for(int i=len;i>=1;i--){
if(a[i]>b.a[i]) return false;
if(a[i]<b.a[i]) return true;
}
return true;
}
}
int operator % (const int b){
int c=0;
for(int i=len;i>=1;i--){
c=(c*10+a[i])%b;
}
return c;
}
Bigint operator * (int b) const{
Bigint c;c.len=len;
for(int i=1;i<=c.len;i++){
c.a[i]+=a[i]*b;
c.a[i+1]+=c.a[i]/10;
c.a[i]=c.a[i]%10;
}
int num=0;
while(b){
num++;
b=b/10;
}
c.len=num+len+1;
while(!c.a[c.len]) c.len--;
return c;
}
Bigint operator ++ (){
Bigint O;
O.a[1]=1;
*this=*this+O;
return *this;
}
Bigint operator / (int b) const{
int c=0;Bigint ans;
for(int i=len;i>=1;i--){
ans.a[i]=ans.a[i]+(c*10+a[i])/b;
c=(c*10+a[i])%b;
}
ans.len=len;
while(!ans.a[ans.len]) ans.len--;
return ans;
}
bool operator < (const Bigint b) const{
if(flag!=b.flag){
if(!flag) return true;
if(flag) return false;
}
if(flag){
if(len<b.len) return true;
if(len>b.len) return false;
for(int i=len;i>=1;i--){
if(a[i]<b.a[i]) return true;
if(a[i]>b.a[i]) return false;
}
return false;
}
else{
if(len<b.len) return false;
if(len>b.len) return true;
for(int i=len;i>=1;i--){
if(a[i]<b.a[i]) return false;
if(a[i]>b.a[i]) return true;
}
return true;
}
}
Bigint operator + (const Bigint b)const{
if(flag&&b.flag){
Bigint c;
c.len=max(len,b.len);
for(int i=1;i<=c.len;i++){
c.a[i]+=a[i]+b.a[i];
c.a[i+1]+=c.a[i]/10;
c.a[i]=c.a[i]%10;
}
while(c.a[c.len+1]) c.len++;
return c;
}
if(!flag&&!b.flag){
Bigint c;
c.len=max(len,b.len);
for(int i=1;i<=c.len;i++){
c.a[i]+=a[i]+b.a[i];
c.a[i+1]+=c.a[i]/10;
c.a[i]=c.a[i]%10;
}
while(c.a[c.len+1]) c.len++;
c.flag=false;
return c;
}
if(flag&&!b.flag) return *this-b;
if(!flag&&b.flag) return b-*this;
}
Bigint operator - (Bigint b) const{
if(b==*this){Bigint O;return O;}
if(*this<b){
Bigint c;
c=b-*this;
c.flag=false;
return c;
}
if(flag&&!b.flag){
b.flag=true;
return *this+b;
}
if(flag&&b.flag){
Bigint c;
c.len=max(len,b.len);
for(int i=1;i<=c.len;i++){
c.a[i]+=a[i]-b.a[i];
if(c.a[i]<0){
c.a[i]+=10;
c.a[i+1]--;
}
}
while(!c.a[c.len]) c.len--;
return c;
}
if(!flag&&!b.flag){
b.flag=true;
Bigint c=*this;c.flag=true;
return b-c;
}
}
Bigint operator * (const Bigint b) const{
Bigint c;
for(int i=1;i<=len;i++)
for(int j=1;j<=b.len;j++){
c.a[i+j-1]+=a[i]*b.a[j];
c.a[i+j-1+1]+=c.a[i+j-1]/10;
c.a[i+j-1]=c.a[i+j-1]%10;
}
c.len=len+b.len+100;
while(!c.a[c.len]) c.len--;
c.len+=c.len==0?1:0;
return c;
}
void scan(){
char c[N];
int top=0;
scanf("%s",c);
len=strlen(c);
flag=true;
if(c[0]=='-') {flag=false;top=1;}
for(int i=len-1;i>=top;i--)
a[len-i]=c[i]-'0';
}
void print(){
if(!flag) printf("-");
for(int i=len;i>=1;i--)
printf("%d",a[i]);
}
}a,ans,b;
int main(){
a.scan();b.scan();
ans=a*b;
ans.print();
return 0;
}