#include <iostream>

using namespace std;

const long long M = 1000000007;
const long long STEP = 10000000;

// Tu wklejasz tablicę wygenerowaną przez poprzedni program
// Zawiera ona wyniki dla: 0!, 10000000!, 20000000!, ..., 1000000000! mod (10^9 + 7)
long long kamienie[] = {
    1, /* TUTAJ WKLEJ WYGENEROWANE LICZBY, BĘDZIE ICH OKOŁO 100 */
};

int main() {
    // Ekstremalne przyspieszenie strumieni (bardzo ważne przy rygorystycznych limitach czasu)
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    long long n;
    if (!(cin >> n)) return 0;

    // Jeżeli N jest większe lub równe wartości modułu, jednym z czynników 
    // silni będzie M, więc cała reszta z dzielenia zawsze da 0.
    if (n >= M) {
        cout << 0 << "\n";
        return 0;
    }

    // Szukamy, od jakiego kamienia milowego możemy zacząć
    long long paczka = n / STEP;
    long long res = kamienie[paczka];
    
    // Obliczamy od kąd musimy ręcznie domnażać (np. od 30 000 001)
    long long start = paczka * STEP + 1;

    // Domnażamy resztę. Pętla wykona się maksymalnie 10 milionów razy (błyskawicznie)
    for (long long i = start; i <= n; ++i) {
        res = (res * i) % M;
    }

    cout << res << "\n";
    return 0;
}