/*
问题描述
  输入一个正整数n,输出n!的值。
  其中n!=1*2*3*…*n。
算法描述
  n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。
  将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。
  首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。
输入格式
  输入包含一个正整数n,n<=1000。
输出格式
  输出n!的准确值。
样例输入
10
样例输出
3628800
*/
#include <iostream>
#include <vector>
using namespace std;

// 高精度乘法
vector<int> multiply(vector<int> &a, int b) {
    vector<int> c;
    int t = 0; // 进位
    for (int i = 0; i < a.size() || t; i++) {
    	/*
    	这里的 i < a.size() || t 是一个条件表达式,
		用于控制循环的终止条件。这个循环是计算高精度乘法的核心部分,从低位到高位依次计算出每一位的值。
		具体来说,当 i 小于数组 a 的长度时,说明还有元素需要遍历,这时候需要继续循环。
		而当进位变量 t 不为0时,说明还有进位需要处理,也需要继续循环。只有当 i 大于等于数组 a 的长度并且进位变量 t 为0时,才可以退出循环。
		这样设计的目的是保证循环能够正确地计算出所有位数的结果,
		同时避免无限循环的情况。因为进位变量 t 最多只能是1,所以当 i 大于等于数组 a 的长度时,t 必须为0才能终止循环,否则就会进入死循环。
    	*/
        if (i < a.size()) t += a[i] * b; // 乘法操作
        c.push_back(t % 10); // 取余数
        t /= 10; // 取进位
    }
    return c; // 返回高精度乘积
}

// 输出高精度数
void print(vector<int> &a) {
    for (int i = a.size() - 1; i >= 0; i--) {
        cout << a[i]; // 逆序输出
    }
    cout << endl; // 换行
}

int main() {
    int n;
    cin >> n; // 读入n
    vector<int> a;
    a.push_back(1); // 初始化a为1
    for (int i = 2; i <= n; i++) {
        a = multiply(a, i); // a = a * i,更新a的值
    }
    print(a);
    return 0;
}


/*
 * 问题描述
  输入一个正整数n,输出n!的值。
  其中n!=1*2*3*…*n。
算法描述
  n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。
  将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。
  首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。
输入格式
  输入包含一个正整数n,n<=1000。
输出格式
  输出n!的准确值。
样例输入
10
样例输出
3628800
 */
package cn.meowrain;
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        BigInteger res = new BigInteger("1");
        for(int i = 1;i<=n;i++){
        	res = res.multiply(BigInteger.valueOf(i));
        }
        System.out.println(res);
    }
}