Cod sursa(job #490655)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 7 octombrie 2010 11:54:26
Problema Kperm Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.88 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] = (Perm[i - 1] * i) % MOD;

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

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