Cod sursa(job #490660)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 7 octombrie 2010 12:02:21
Problema Kperm Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.87 kb
#include <stdio.h>
#define MOD     666013
#define maxM    5010

int Perm[maxM];

int log_pow (int A, int N) {
    if (N == 0) return 1;
    if (N == 1) return A;
    int x = log_pow(A, N / 2);
    x = (1LL * x * x) % MOD;
    if (N % 2 == 1)
        return (1LL * x * A) % MOD;
    return x;
}

int main () {
    int N, K, i, P, rest, A, B;

    freopen("kperm.in", "r", stdin);
    freopen("kperm.out", "w", stdout);

    scanf("%d%d", &N, &K);

    if (K % 2 == 0) {
        printf("%d\n", 0);
        return 0;
    }

    P = N / K;
    rest = N - P * K;

    for (i = 1, Perm[0] = 1; i <= K; ++ i)
        Perm[i] = (1LL * Perm[i - 1] * i) % MOD;

    A = (1LL * log_pow(Perm[P + 1], rest) *  Perm[rest]) % MOD;
    B = (1LL * log_pow(Perm[P], K - rest) * Perm[K - rest]) % MOD;

    fprintf(stderr, "%d %d\n", A, B);
    printf("%d\n", (int) ((1LL * A * B) % MOD));
    return 0;
}