Pagini recente » Cod sursa (job #694230) | Cod sursa (job #229060) | Cod sursa (job #1176606) | Cod sursa (job #1515535) | Cod sursa (job #132555)
Cod sursa(job #132555)
Utilizator |
Mircea Pasoi domino |
Data |
6 februarie 2008 01:47:48 |
Problema |
Arbori |
Scor |
Ascuns |
Compilator |
cpp |
Status |
done |
Runda |
|
Marime |
0.92 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 (!res) return;
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;
}