const
int
N
=
1100
;
struct BigNum {
int front;
int data[N+1];
} ;
BigNum & Mulit(BigNum up, BigNum down) {
int i,k,carry,v;
BigNum prod;
prod.front=up.front+down.front-N+1;
for(i=prod.front;i<=N;i++)prod.data[i]=0;
for(i=N;i>=down.front;i--){
BigNum tmp;
carry=0;
for(k=N;k>=up.front;k--){
v=down.data[i]*up.data[k]+carry;
tmp.data[k]=v%10;
carry=v/10;
}
tmp.front=up.front;
if(carry>0) tmp.data[--tmp.front]=carry;
carry=0;
for(k=N;k>=tmp.front;k--){
v=tmp.data[k]+prod.data[i+k-N]+carry; // when i==N, k to k, then i is decreased 1 each step.
prod.data[i+k-N]=v%10;
carry=v/10;
}
while(carry>0){
v=prod.data[i+k-N]+carry;
prod.data[i+k-N]=v%10;
carry=v/10;
k--;
}
}
while(prod.data[prod.front]==0 && prod.front<N) prod.front++;
return prod;
}
// 30'
struct BigNum {
int front;
int data[N+1];
} ;
BigNum & Mulit(BigNum up, BigNum down) {
int i,k,carry,v;
BigNum prod;
prod.front=up.front+down.front-N+1;
for(i=prod.front;i<=N;i++)prod.data[i]=0;
for(i=N;i>=down.front;i--){
BigNum tmp;
carry=0;
for(k=N;k>=up.front;k--){
v=down.data[i]*up.data[k]+carry;
tmp.data[k]=v%10;
carry=v/10;
}
tmp.front=up.front;
if(carry>0) tmp.data[--tmp.front]=carry;
carry=0;
for(k=N;k>=tmp.front;k--){
v=tmp.data[k]+prod.data[i+k-N]+carry; // when i==N, k to k, then i is decreased 1 each step.
prod.data[i+k-N]=v%10;
carry=v/10;
}
while(carry>0){
v=prod.data[i+k-N]+carry;
prod.data[i+k-N]=v%10;
carry=v/10;
k--;
}
}
while(prod.data[prod.front]==0 && prod.front<N) prod.front++;
return prod;
}
// 30'