long int res[N];
void add(long int *a,long int *b)//高精度加法
{long int i,k=0,adw=0,flag=0,tem1,tem2;
for(i=0;flag!=2;i++,k++)
{ if(a[i]==-1)tem1=0;else tem1=a[i];
if(b[i]==-1)tem2=0; else tem2=b[i];
res[k]=tem1+tem2+adw;//adw 进位位
adw=res[k]/10000;
res[k]=res[k]%10000;
if(a[i+1]==-1)flag++;
if(b[i+1]==-1)flag++;
}if(adw)res[k++]=adw;//判断进位是否有值
res[k+1]=-1;//标记最高位 }
void sub(long int *a,long int *b)//高精度 减法
{ long int tem,i,k=0,subw=0,flag=0;
for(i=0;flag!=2;i++)
{ if(b[i]==-1)tem=0;else tem=b[i];
if(a[i]>=(tem+subw))res[k++]=a[i]-tem-subw,subw=0;//subw借位位
else res[k++]=10000+a[i]-tem-subw,subw=1;
if(a[i+1]==-1)flag++;
if(b[i+1]==-1)flag++;
}
while(res[k]<=0&&k>0)res[k]=0,k--;//去首位0
res[k+1]=-1;//标记最高位
}
void mult(long int *a,long int *b)//高精度 乘法
{ long int i,j,k;
for(i=0;a[i]!=-1;i++)
{
for(j=0;b[j]!=-1;j++)
{ res[i+j]+=a[i]*b[j];
if(res[i+j]>=10000)res[i+j+1]+=res[i+j]/10000,res[i+j]%=10000;
}
k=i+j+1;
while(res[k]>=10000)res[k+1]+=res[k]/10000,res[k]%=10000,k++;
}while(res[k]<=0&&k>0)k--;//去首位0
res[k+1]=-1; }
void dsjc(long int n)//计算阶乘
{ long int i,j,m;long long int a[n];
memset(a,0,sizeof(a));
a[0]=1; j=0;m=0; //初始化
do//计算阶乘 从 n 到 1 反计算
{ for(i=j=0;i<=m;i++)
j+=a[i]*n,a[i]=j%C,j/=C;//C 为进制 此时 为 5位(100000)
j?a[++m]=j:0;//判断是否进位
}while(--n);
printf("%ld",a[m]);//输出
while(m) printf(" %05ld ",a[--m]);printf("\n");}