Cod sursa(job #648746)

Utilizator SpiderManSimoiu Robert SpiderMan Data 14 decembrie 2011 08:42:00
Problema Dirichlet Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.89 kb
# include <cstdio>

const char *FIN = "dirichlet.in", *FOU = "dirichlet.out";
const int MAX = 2000005, MOD = 9999991;

int N, F[MAX];

inline int mod (long long A) {
    if (A >= MOD) A %= MOD;
    if (A < 0) A += MOD;
    return A;
}

inline int lgput (int N, int P) {
    int sol = 1;
    for ( ; P ; P >>= 1 ) {
        if ( P & 1 )
            sol = mod (1LL * sol * N);
        N = mod (1LL * N * N);
    }
    return sol;
}

inline int im (int N) {
    return lgput (N, MOD - 2);
}

inline int C (int N, int K) {
    return mod (mod (1LL * F[N] * im (F[N - K])) * 1LL * im (F[K]));
}

inline int cat (int N) {
    F[0] = 1;
    for (int i = 1; i <= MAX - 5; ++i)
        F[i] = mod (1LL * F[i - 1] * i);
    return mod (C(N << 1, N) - C(N << 1, N + 1));
}

int main (void) {
    fscanf (fopen (FIN, "r"), "%d", &N);
    fprintf (fopen (FOU, "w"), "%d", cat (N));
}