Cod sursa(job #137503)

Utilizator stef2nStefan Istrate stef2n Data 17 februarie 2008 12:29:10
Problema Arbori Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 4, Clasele 11-12 Marime 0.89 kb
#include <cstdio>
#include <vector>
using namespace std;

int N, M, K;
long long A[100];
vector <int> p;

void partition(const int &N, int s, int K)
{
    if(s==N-1)
    {
        if((int)p.size() % M == K)
        {
            long long value=1;
            for(size_t i=0; i<p.size() && value; ++i)
                value*=A[p[i]];
            A[N]+=value;
        }
        return;
    }
    if(p.empty())
        p.push_back(1);
    else
        p.push_back(p.back());
    for(; s+p.back()<=N-1; ++p[p.size()-1])
        partition(N, s+p.back(), K);
    p.pop_back();
}

void solve()
{
    A[1]=1;
    for(int i=2; i<N; ++i)
    {
        A[i]=0;
        partition(i, 0, (K-1+M)%M);
    }
    A[N]=0;
    partition(N, 0, K);
}


int main()
{
    freopen("arbori.in", "r", stdin);
    freopen("arbori.out", "w", stdout);
    scanf("%d %d %d", &N, &M, &K);
    solve();
    printf("%Ld\n", A[N]);
    return 0;
}