Cod sursa(job #132553)

Utilizator dominoMircea Pasoi domino Data 6 februarie 2008 01:46:27
Problema Arbori Scor Ascuns
Compilator cpp Status done
Runda Marime 0.9 kb
#include <stdio.h>

#define FIN "arbori.in"
#define FOUT "arbori.out"
#define MAX_N 95
#define ll long long

int N, M, K;
ll A[MAX_N][2];

ll C(ll n, ll k)
{
    ll i, ret = 1;

    for (i = 1; i <= k; ++i)
        ret *= n-k+i, ret /= i;
    return ret;
}

void bkt(int n, int size, int cnt, ll res, int idx)
{
    int i;

    if (!n)
    {
        if (cnt == K)
            A[idx][0] += res;
        if (cnt == (K+M-1)%M)
            A[idx][1] += res;
        return;
    }

    if (size > n) return;
    for (i = 0; i*size <= n; ++i)
            bkt(n-i*size, size+1, (cnt+i)%M, res*C(A[size][1]+i-1, i), idx);
}

int main(void)
{
    int i;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

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

    A[1][1] = 1;
    for (i = 2; i <= N; ++i)
        bkt(i-1, 1, 0, 1, i);

    printf("%lld\n", A[N][0]);

    return 0;
}