Cod sursa(job #135423)

Utilizator astronomyAirinei Adrian astronomy Data 13 februarie 2008 19:28:15
Problema Arbori Scor Ascuns
Compilator cpp Status done
Runda Marime 1 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 = n-k+1; i <= n; i++) ret *= i;
    for(i = (llong)k; i >= 1; 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;
}