Cod sursa(job #158145)

Utilizator astronomyAirinei Adrian astronomy Data 13 martie 2008 14:33:16
Problema Arbori Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <stdio.h>
#include <string.h>
using namespace std;

#define llong long long
#define MAXN 92
#define MAXK 11

int N, M, K;

llong A[MAXN][MAXK][MAXN];

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

llong baga(int n, int k, int p)
{
    if(n == 1 && k == 0) return 1;
    if(p > n-1) return 0;
    
    if(A[n][k][p] != -1) return A[n][k][p];

    int i; llong ret = 0;

    for(i = 0; i*p < n; i++)
    {
        if(p == 1)
            ret += baga(n-i*p, (k-i%M+M)%M, p+1);
        else
            ret += baga(n-i*p, (k-i%M+M)%M, p+1) *
            comb( baga(p, (K-1+M)%M, 1)+i-1, i);
    }

    return A[n][k][p] = ret;
}

int main(void)
{
    freopen("arbori.in", "rt", stdin);
    freopen("arbori.out", "wt", stdout);

    scanf("%d %d %d\n", &N, &M, &K);
    memset(A, -1, sizeof(A));
    printf("%lld\n", baga(N, K, 1));

    return 0;
}