迭代实现
// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<set>
#include<map>
#include<cmath>
#include<sstream>
#include<queue>
#include<vector>
#include<deque>
using namespace std;
typedef long long ll;
typedef vector<ll> vi;
const double pi=acos(-1);
const int MAXN=1e7+11;
#define For(a,b,c) for (ll (a)=(b);(a)<(c);(a)++)
#define foreach(iter,V) for (__typeof((V).begin()) iter=(V).begin();iter!=(V).end();iter++)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
struct cp{
double x,y;
cp(){}
cp(double nx,double ny){
x=nx;y=ny;
}
cp operator + (cp &a) {return cp(a.x+x,a.y+y);}
cp operator - (cp &a) {return cp(x-a.x,y-a.y);}
cp operator * (cp &a) {return cp(a.x*x-a.y*y,a.x*y+a.y*x);}
}a[MAXN],b[MAXN];
ll limit,l,r[MAXN];
void fast_fast_tle(cp *A,ll type){
For(i,0,limit) if (i<r[i]) swap(A[i],A[r[i]]);
for (int mid=1;mid<limit;mid*=2){
cp Wn=cp(cos(pi/mid),type*sin(pi/mid));
int r=mid*2;
for (int j=0;j<limit;j+=r){
cp w=cp(1,0);
for (int k=0;k<mid;k++,w=w*Wn){
cp t=w*A[j+mid+k];
A[j+mid+k]=A[j+k]-t;
A[j+k]=A[j+k]+t;
}
}
}
}
int ch[1000001];
int main(){
// freopen("testdata.in","r",stdin);
// freopen("out.txt","w",stdout);
ll n,m;
scanf("%lld",&n);
m=n;
char c;
For(i,0,n) {
cin>>c;
a[i].x=c-'0';
}
For(i,0,m) {
cin>>c;
b[i].x=c-'0';
}
limit=1;
while (limit<=m+n) limit*=2,l++;
For(i,0,limit) r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
fast_fast_tle(a,1);
fast_fast_tle(b,1);
For(i,0,limit+1) a[i]=a[i]*b[i];
fast_fast_tle(a,-1);
For(i,0,m+n-1) ch[i+1]=(int)(a[i].x/limit+0.5);
int ed=1;
for (int i=m+n-1;i>=1;i--)
if (ch[i]>=10){
ch[i-1]+=ch[i]/10;
ch[i]%=10;
if (i==1) ed=0;
}
while(ch[ed]==0&&ed<m+n-1) ed++;
For(i,ed,m+n) printf("%d",ch[i]);
return 0;
}