#include #include #include #include #include #include #include #include #include #include char* readline(); char* ltrim(char*); char* rtrim(char*); int parse_int(char*); #define MAX_PARTS 200 // Adjust based on the maximum size you need struct BigNumber { unsigned char parts[MAX_PARTS]; }; typedef struct BigNumber BigNumber; void multipleBigNumbers(const struct BigNumber* a, unsigned int n, struct BigNumber* result) { static int carr = 0; for (int i = 0; i < MAX_PARTS; i++) { int res = a->parts[i] * n; result->parts[i] = (res + carr)%10; carr = ((res + carr) / 10); } } BigNumber factorial(unsigned int n) { BigNumber result = {0}; result.parts[0] = 1; for(unsigned int i = 2; i <= n; i++) { multipleBigNumbers (&result, i,&result); } return result; } void extraLongFactorials(int n) { BigNumber result = factorial(n); bool skip = true; for (int i = MAX_PARTS - 1; i >= 0; i--) { if(result.parts[i] != 0) { skip = false; } if(skip == false) { printf("%d", result.parts[i]); } } } int main() { int n = parse_int(ltrim(rtrim(readline()))); extraLongFactorials(n); return 0; } char* readline() { size_t alloc_length = 1024; size_t data_length = 0; char* data = malloc(alloc_length); while (true) { char* cursor = data + data_length; char* line = fgets(cursor, alloc_length - data_length, stdin); if (!line) { break; } data_length += strlen(cursor); if (data_length < alloc_length - 1 || data[data_length - 1] == '\n') { break; } alloc_length <<= 1; data = realloc(data, alloc_length); if (!data) { data = '\0'; break; } } if (data[data_length - 1] == '\n') { data[data_length - 1] = '\0'; data = realloc(data, data_length); if (!data) { data = '\0'; } } else { data = realloc(data, data_length + 1); if (!data) { data = '\0'; } else { data[data_length] = '\0'; } } return data; } char* ltrim(char* str) { if (!str) { return '\0'; } if (!*str) { return str; } while (*str != '\0' && isspace(*str)) { str++; } return str; } char* rtrim(char* str) { if (!str) { return '\0'; } if (!*str) { return str; } char* end = str + strlen(str) - 1; while (end >= str && isspace(*end)) { end--; } *(end + 1) = '\0'; return str; } int parse_int(char* str) { char* endptr; int value = strtol(str, &endptr, 10); if (endptr == str || *endptr != '\0') { exit(EXIT_FAILURE); } return value; }