Cod sursa(job #648743)

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

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

int N, F[MAX], I[MAX];

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

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

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 cat (int N) {
    F[0] = I[0] = 1;
    for (int i = 1; i <= N << 1; ++i) {
        F[i] = mod (1LL * F[i - 1] * i);
        I[i] = lgput (F[i], MOD - 2);
    }
    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));
}