#define PROBLEM "https://onlinejudge.u-aizu.ac.jp/courses/library/6/NTL/2/NTL_2_F"
#include"../../template.h"
#include"../BigInt_full.h"// Test karatsuba algovoidsolve(){BigInta,b;cin>>a>>b;cout<<a*b<<'\n';}
#line 1 "Big_Integer/test/Multiplication_of_Big_Integers_II.test.cpp"
#define PROBLEM "https://onlinejudge.u-aizu.ac.jp/courses/library/6/NTL/2/NTL_2_F"
#line 2 "template.h"
#include<bits/stdc++.h>usingnamespacestd;#define ll long long
#define MOD (ll)(1e9+7)
#define all(x) (x).begin(),(x).end()
#define unique(x) x.erase(unique(all(x)), x.end())
#define INF32 ((1ull<<31)-1)
#define INF64 ((1ull<<63)-1)
#define inf (ll)1e18
#define vi vector<int>
#define pii pair<int, int>
#define pll pair<ll, ll>
#define fi first
#define se second
constintmod=998244353;voidsolve();intmain(){ios_base::sync_with_stdio(false);cin.tie(NULL);// cin.exceptions(cin.failbit);// int t; cin >> t;// while(t--)solve();cerr<<"\nTime run: "<<1000*clock()/CLOCKS_PER_SEC<<"ms"<<'\n';return0;}#line 2 "Big_Integer/BigInt_full.h"
// Still slow ver, need optimize// This template only work for base <= 10constintBASE_DIGITS=9;constintBASE=1000000000;classBigInt{public:intsign;vector<uint32_t>digit;BigInt():sign(1){}BigInt(conststring&s){*this=s;}BigInt(int64_tval){*this=val;}BigInt&operator=(constBigInt&b){sign=b.sign;digit=b.digit;return*this;}BigInt&operator=(conststring&s){read(s);return*this;}BigInt&operator=(int64_tval){sign=val>=0?1:-1;val=llabs(val);digit.clear();for(;val;val/=BASE){digit.push_back(val%BASE);}trim();return*this;}BigInt&operator+=(constBigInt&b){if(sign!=b.sign){BigIntt=b;t.sign*=-1;return*this-=t;}intcarry=0,len=(int)max(size(),b.size());for(inti=0;i<len;i++){intsum=carry;if(i<(int)size())sum+=digit[i];if(i<(int)b.size())sum+=b[i];if(i<(int)size())digit[i]=sum%BASE;elsedigit.push_back(sum%BASE);carry=sum/BASE;}if(carry)digit.push_back(carry);trim();return*this;}BigInt&operator-=(constBigInt&b){if(sign!=b.sign){return*this+=(-b);}if(__compare_abs(b)==-1){BigIntt=b;t-=*this;t.sign*=-1;return*this=t;}intborrow=0,len=(int)max(size(),b.size());for(inti=0;i<len;i++){intsub=-borrow;if(i<(int)size())sub+=digit[i];if(i<(int)b.size())sub-=b[i];if(sub<0)sub+=BASE,borrow=1;elseborrow=0;digit[i]=sub;}trim();return*this;}BigInt&operator*=(constBigInt&b){return*this=karatsuba(*this,b);}BigInt&operator/=(constBigInt&b){*this=divmod(*this,b).first;return*this;}BigInt&operator%=(constBigInt&b){*this=divmod(*this,b).second;return*this;}// ------------------------ Operator ------------------------// BigInt += IntBigInt&operator+=(int64_tt){return*this+=BigInt(t);}BigInt&operator-=(int64_tt){return*this-=BigInt(t);}BigInt&operator*=(int64_tt){return*this*=BigInt(t);}BigInt&operator/=(int64_tt){assert(t!=0);// not divided for 0int64_trem=0;for(inti=(int)size()-1;i>=0;i--){int64_tcur=rem*BASE+(*this)[i];(*this)[i]=uint32_t(cur/t);rem=cur%t;}trim();sign=sign*(t<0?-1:1);return*this;}BigInt&operator%=(int64_tt){assert(t!=0);int64_trem=0;for(inti=(int)size()-1;i>=0;i--){int64_tcur=rem*BASE+(*this)[i];rem=cur%t;}if(rem<0)rem+=llabs(t);ints=sign;*this=rem;sign=s;return*this;}BigIntoperator-()const{BigIntres=*this;res*=-1;returnres;}// -a;BigIntoperator+()const{returnBigInt(*this);}// +a;BigInt&operator++(){*this+=1;return*this;}// ++a;BigInt&operator--(){*this-=1;return*this;}// --a;BigIntoperator++(int){BigIntres=*this;*this+=1;returnres;}// a++;BigIntoperator--(int){BigIntres=*this;*this-=1;returnres;}// a--;// BigInt = BigInt + BigIntBigIntoperator+(constBigInt&b)const{returnBigInt(*this)+=b;}BigIntoperator-(constBigInt&b)const{returnBigInt(*this)-=b;}BigIntoperator*(constBigInt&b)const{returnBigInt(*this)*=b;}BigIntoperator/(constBigInt&b)const{returnBigInt(*this)/=b;}BigIntoperator%(constBigInt&b)const{returnBigInt(*this)%=b;}// BigInt = BigInt + IntBigIntoperator+(int64_tt)const{returnBigInt(*this)+=t;}BigIntoperator-(int64_tt)const{returnBigInt(*this)-=t;}BigIntoperator*(int64_tt)const{returnBigInt(*this)*=t;}BigIntoperator/(int64_tt)const{returnBigInt(*this)/=t;}BigIntoperator%(int64_tt)const{returnBigInt(*this)%=t;}// BigInt = Int + BigIntfriendBigIntoperator+(int64_tt,constBigInt&b){BigIntres(t);res+=b;returnres;}friendBigIntoperator-(int64_tt,constBigInt&b){BigIntres(t);res-=b;returnres;}friendBigIntoperator*(int64_tt,constBigInt&b){BigIntres(t);res*=b;returnres;}friendBigIntoperator/(int64_tt,constBigInt&b){BigIntres(t);res/=b;returnres;}friendBigIntoperator%(int64_tt,constBigInt&b){BigIntres(t);res%=b;returnres;}uint32_toperator[](constinti)const{assert(i>=0&&i<(int)size());returndigit[i];}uint32_t&operator[](constinti){assert(i>=0&&i<(int)size());returndigit[i];}// ------------------------- Comparison ---------------------booloperator<(constBigInt&b)const{if(sign!=b.sign){returnsign<b.sign;}if(size()!=b.size()){returnsize()*sign<b.size()*b.sign;}for(inti=(int)size()-1;i>=0;i--){if((*this)[i]!=b[i]){return(*this)[i]*sign<b[i]*sign;}}returnfalse;}booloperator>(constBigInt&b)const{returnb<*this;}booloperator<=(constBigInt&b)const{return!(b<*this);}booloperator>=(constBigInt&b)const{return!(*this<b);}booloperator==(constBigInt&b)const{return!(*this<b)&&!(b<*this);}booloperator!=(constBigInt&b)const{return*this<b||b<*this;}booloperator==(int64_tt)const{return*this==BigInt(t);}booloperator!=(int64_tt)const{return*this!=BigInt(t);}booloperator<(int64_tt)const{return*this<BigInt(t);}booloperator<=(int64_tt)const{return*this<=BigInt(t);}booloperator>(int64_tt)const{return*this>BigInt(t);}booloperator>=(int64_tt)const{return*this>=BigInt(t);}// 0 if |a| == |b|// -1 if |a| < |b|// 1 if |a| > |b|int__compare_abs(constBigInt&b)const{if(size()!=b.size()){returnsize()<b.size()?-1:1;}for(inti=(int)size()-1;i>=0;i--){if((*this)[i]!=b[i]){return(*this)[i]<b[i]?-1:1;}}return0;}// -------------------- karatsuba ---------------------BigIntmul_simple(constBigInt&a,constBigInt&b){BigIntx=a,y=b;BigIntres;res.sign=x.sign*y.sign;res.digit.resize(x.size()+y.size());for(inti=0;i<(int)x.size();i++){uint64_tcarry=0;for(intj=0;j<(int)y.size();j++){uint64_tcur=res[i+j]+carry;cur+=1ull*x[i]*y[j];res[i+j]=cur%BASE;carry=cur/BASE;}if(carry)res[i+(int)y.size()]+=carry;}res.trim();if(res.isZero())res.sign=1;returnres;}BigIntshifted(intk)const{if(isZero())return*this;BigIntr=*this;r.digit.insert(r.digit.begin(),k,0);returnr;}BigIntkaratsuba(constBigInt&a,constBigInt&b){if(a.size()<32||b.size()<32){returnmul_simple(a,b);}size_tn=max(a.size(),b.size());size_tk=n/2;BigInta_low,a_high,b_low,b_high;intm1=min(k,a.size()),m2=min(k,b.size());a_low.digit.assign(a.digit.begin(),a.digit.begin()+m1);a_high.digit.assign(a.digit.begin()+m1,a.digit.end());b_low.digit.assign(b.digit.begin(),b.digit.begin()+m2);b_high.digit.assign(b.digit.begin()+m2,b.digit.end());a_low.sign=a_high.sign=b_low.sign=b_high.sign=1;a_low.trim();a_high.trim();b_low.trim();b_high.trim();BigIntz0=karatsuba(a_low,b_low);BigIntz1=karatsuba(a_high,b_high);BigIntz2=karatsuba(a_low+a_high,b_low+b_high)-z1-z0;BigIntres=z1.shifted(2*k)+z2.shifted(k)+z0;res.trim();res.sign=(a.sign!=b.sign?-1:1);returnres;}// ------------------------ Div / Mod -----------------------pair<BigInt,BigInt>divmod(constBigInt&a1,constBigInt&b1){assert(b1!=0);// not divided for 0llnorm=BASE/(b1.digit.back()+1);BigInta=a1.abs()*norm;BigIntb=b1.abs()*norm;BigIntq=0,r=0;q.digit.resize(a.size());for(inti=a.size()-1;i>=0;i--){r*=BASE;r+=a[i];int64_ts1=r.size()<=b.size()?0:r[b.size()];int64_ts2=r.size()<=b.size()-1?0:r[b.size()-1];int64_td=(BASE*s1+s2)/b.digit.back();if(d>=BASE){d=BASE-1;}r-=b*d;while(r<0){r+=b,--d;}q[i]=d;}q.sign=a1.sign*b1.sign;r.sign=a1.sign;q.trim();r.trim();BigIntremainder;remainder.digit.resize(r.size());int64_tcarry=0;for(inti=(int)r.size()-1;i>=0;i--){int64_tcur=r[i]+carry*BASE;remainder[i]=cur/norm;carry=cur%norm;}remainder.trim();autores=make_pair(q,remainder);if(res.second<0){res.second+=b1.abs();}returnres;}// ------------------------- Misc ---------------------------size_tsize()const{returndigit.size();}boolisZero()const{returndigit.empty();}voidtrim(){while(!digit.empty()&&!digit.back()){digit.pop_back();}if(digit.empty())sign=1;}BigIntabs()const{BigIntres=*this;res.sign=1;returnres;}stringtoString()const{ostringstreamoss;oss<<*this;returnoss.str();}// only support b >= 0, if b < 0 need to implement modulo inversefriendBigIntpow(constBigInt&a,constBigInt&b,llmod){returnpow(a,b,BigInt(mod));}friendBigIntpow(constBigInt&a,constBigInt&b,constBigInt&mod){BigIntx(a),y(b),res(1);while(y!=0){if(y[0]%2==1)res=res*x%mod;x=x*x%mod;y/=2;}returnres;}friendBigInt__gcd(constBigInt&a,constBigInt&b){if(b==0)returna;return__gcd(b,a%b);}friendBigInt__lcm(constBigInt&a,constBigInt&b){returna/__gcd(a,b)*b;}// safe sqrt for long long and BigIntfriendBigIntsqrt(constBigInt&a1){BigInta=a1;while(a.digit.empty()||a.size()%2==1){a.digit.push_back(0);}intn=a.size();intfirstDigit=(int)sqrt((double)a[n-1]*BASE+a[n-2]);intnorm=BASE/(firstDigit+1);a=a*norm*norm;while(a.digit.empty()||a.size()%2==1){a.digit.push_back(0);}BigIntr=1ll*a[n-1]*BASE+a[n-2];firstDigit=(int)sqrt((double)a[n-1]*BASE+a[n-2]);intq=firstDigit;BigIntres;for(intj=n/2-1;j>=0;j--){for(;;--q){BigIntr1=(r-(res*2*BigInt(BASE)+q)*q)*BigInt(BASE)*BigInt(BASE);r1+=(j>0?1ll*a[2*j-1]*BASE+a[2*j-2]:0);if(r1>=0){r=r1;break;}}res*=BASE;res+=q;if(j>0){intd1=res.size()+2<r.size()?r[res.size()+2]:0;intd2=res.size()+1<r.size()?r[res.size()+1]:0;intd3=res.size()<r.size()?r[res.size()]:0;q=(1ll*d1*BASE*BASE+1ll*d2*BASE+d3)/(firstDigit*2);}}res.trim();returnres/norm;}// ---------------------- Input Output ---------------------/* only use for decimal number */voidread(conststring&s){sign=(s[0]=='-'?-1:1);digit.clear();intpos=(s[0]=='-'?1:0);for(inti=(int)s.size()-1;i>=pos;i-=BASE_DIGITS){intx=0;intk=max(pos,i-BASE_DIGITS+1);for(intj=k;j<=i;j++){x=x*10+(s[j]-'0');}digit.push_back(x);}trim();}friendistream&operator>>(istream&in,BigInt&a){strings;in>>s;a.read(s);returnin;}friendostream&operator<<(ostream&out,constBigInt&a){if(a.sign==-1&&!a.isZero())out<<'-';out<<(a.digit.empty()?0:a.digit.back());for(inti=(int)a.size()-2;i>=0;i--)out<<setw(BASE_DIGITS)<<setfill('0')<<a[i];returnout;}};#line 5 "Big_Integer/test/Multiplication_of_Big_Integers_II.test.cpp"
// Test karatsuba algovoidsolve(){BigInta,b;cin>>a>>b;cout<<a*b<<'\n';}