Pagini recente » preoni2007_runda2_9 | Rating Alexandru Calin (calinalexandru) | preoni2008-runda5-5-8 | Cod sursa (job #2899809) | Cod sursa (job #132553)
Cod sursa(job #132553)
Utilizator |
Mircea 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;
}