#include using namespace std; const int N = 1e6 + 10; const int BASE = 10000; // 基数为10000 int a[N], al; // 存储最终的和 int f[N], fl; // 存储当前阶乘值 /* 测试用例: 6 答案:873 */ // 高精度乘以低精度 void mul(int a[], int &al, int b) { int t = 0; for (int i = 0; i < al; i++) { t += a[i] * b; a[i] = t % BASE; t /= BASE; } if (t) a[al++] = t; while (al > 1 && a[al - 1] == 0) al--; } // 高精度加法 void add(int a[], int &al, int b[], int bl) { int t = 0; al = max(al, bl); for (int i = 0; i < al; i++) { if (i < bl) t += b[i]; t += a[i]; a[i] = t % BASE; t /= BASE; } if (t) a[al++] = t; } // 输出高精度数 void print(int a[], int al) { // 8->0008 x 8 printf("%d", a[al - 1]); for (int i = al - 2; i >= 0; i--) // 789->0789 printf("%04d", a[i]); printf("\n"); } int main() { int n; cin >> n; // 初始化阶乘数组和和数组 f[0] = 1; fl = 1; a[0] = 0; al = 1; // 计算1!到n!并累加 for (int i = 1; i <= n; i++) { // 计算i! mul(f, fl, i); // 将i!加到总和中 add(a, al, f, fl); } // 输出结果 print(a, al); return 0; }