//加法
string add(string num_1,string num_2){
string re;
int length_1=(int)num_1.size();
int length_2=(int)num_2.size();
int length=max(length_1, length_2);
if(length_1<length_2)
for(int i=0;i<length_2-length_1;i++)
num_1="0"+num_1;
else
for(int i=0;i<length_1-length_2;i++)
num_2="0"+num_2;
int temp;
int carry=0;
for(int i=length-1;i>=0;i--){
temp=num_1[i]-'0'+num_2[i]-'0'+carry;
carry=temp/10;
temp%=10;
re=char(temp+'0')+re;
}
if(carry>0)
re=char(carry+'0')+re;
return re;
}
//乘法
string multiply(string num_1,string num_2){
string re;
int length_1=(int)num_1.size();
int length_2=(int)num_2.size();
for(int i=length_2-1;i>=0;i--){
string temp;
int num=num_2[i]-'0';
int carry=0;
if(num){
for(int j=0;j<length_2-i-1;j++)
temp+="0";
for(int j=length_1-1;j>=0;j--){
int k=( num*(num_1[j]-'0') + carry)%10;
carry=( num*(num_1[j]-'0') + carry)/10;
temp=char(k+'0')+temp;
}
if(carry)
temp=char(carry+'0')+temp;
}
re=add(re, temp);
}
re.erase(0,re.find_first_not_of('0'));
if(re.empty())
re="0";
return re;
}
//阶乘
void factorial(int n){
int a[maxn];
a[0]=1;
int dig=1;
int temp;
for(int i=2;i<=n;i++){
int num=0;
for(int j=0;j<dig;j++){
temp=a[j]*i+num;
a[j]=temp%10;
num=temp/10;
}
while(num){
a[dig]=num%10;
num/=10;
dig++;
}
}
for(int i=dig-1;i>=0;i--)
printf("%d",a[i]);
cout<<endl;
}