***a[i][]表示的是i!,每一个a[i][j]存放一个小于10000。
***用w[i]跟随记录数的长度。
***10000!是一个35660位数
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define inf 0x3f3f3f3f
int a[10002][9000];
int w[10002];//用来记录位数
//35660
void f()
{
a[0][1]=1;a[1][1]=1;a[2][1]=2;a[3][1]=6;
w[0]=1;w[1]=1;w[2]=1;w[3]=1;
int i,j;
int mod=10000;//每一位数存放一个四位数
for(i=4;i<=10000;i++){
int temp=0;
for(j=1;j<=w[i-1];j++){
temp+=a[i-1][j]*i;
a[i][j]=temp%mod;
temp/=mod;
}
a[i][j]=temp;
//处理之后,第i个数的最后一位可能还是=>10000的数
while(a[i][j]>=10000)
{
a[i][j+1]=a[i][j]/10000;
a[i][j]=a[i][j]%10000;
j++;
}
if(0==a[i][j]) w[i]=j-1;
else w[i]=j;
}
}
int main()
{
f();
int n;
while(1==scanf("%d",&n))
{
int i,j;
int len=w[n];
printf("%d",a[n][len]);
for(i=len-1;i>0;i--){
printf("%04d",a[n][i]);
}
cout << endl;
}
return 0;
}