Cod sursa(job #176152)

Utilizator sealTudose Vlad seal Data 10 aprilie 2008 19:56:36
Problema Arbori Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include<stdio.h>
#define Nm 91
#define Mm 10
#define ll long long
#define mod(a) ((a)<0?(a)+m:(a))
int n,m,k;
ll M[Nm][Mm][Nm];

void read()
{
    freopen("arbori.in","r",stdin);
    scanf("%d%d%d",&n,&m,&k);
}

void solve()
{
    int i,r,j,l;
    long long comb;

    for(i=1;i<=n;++i)
        for(r=0;r<m;++r)
            for(j=n;j;--j)
            {
                if(i==1) { M[i][r][j]=1; continue; }
                if(j>=i) continue;
                M[i][r][j]=M[i][r][j+1]; comb=1;
                if(!M[j][mod(k-1)][1]) continue;
                for(l=1;l*j<i;++l)
                {
                    comb=comb*M[j][mod(k-1)][1]/l;
                    M[i][r][j]+=comb*M[i-l*j][mod(r-l)][j+1];
                }
            }
}

void write()
{
    freopen("arbori.out","w",stdout);
    printf("%lld\n",M[n][k][1]);
}

int main()
{
    read();
    solve();
    write();
    return 0;
}