/*
TASK:str
LANG:C++
*/

#include <cstdio>
#include <cstdlib>
#include <algorithm>

using namespace std;

#define MAXN (1<<10)
#define MOD 4999999

#define strip(a) ((a)=((a)+MOD)%MOD)

int N;
int dp[MAXN];
int f[MAXN];
int ii, a, b;

int comb(int n, int k) { 
    a = b = 1;
    if (n < k) {
        return 0;
    }
    for (ii = k+1; ii <= n; ii++) {
        a *= ii;
        strip(a);
    }
    for (ii = 2; ii <= n-k; ii++) {
        b *= ii;
        strip(b);
    } 
    return a/b;
}

int get(int n, int k) {
    int a = 0;
    for (int i = 1; i <= k; i++) {
        a += comb(n, i);

//        printf("a: %d (%d %d) %d\n", a, n, i, comb(n,i));
        strip(a);
    }
    return a;
}

int main() {

    scanf("%d", &N);

    f[0] = 1;
    f[1] = 1;
    f[2] = 1;
        
    for (int i = 3; i <= N; i++) {
        f[i] = f[i-1]*i;
        strip(f[i]);
    }
    
    dp[2] = 1;
    
    for (int i = 3; i <= N; i++) {
            dp[i] = dp[i-1] * (i-1);
        for (int k = 2; k <= i-1; k++) {
            dp[i] += dp[i-1] * comb(i-1, k);
            strip(dp[i]);
            dp[i] += get(i-2, k-1) * f[i-1];
            strip(dp[i]);
        }
    }
    
    printf("%d\n", dp[N]);
    system("pause");
    
    return 0;
}
       

