Pagini recente » Profil shnako | Pitici2 | Monitorul de evaluare | Diferente pentru arhiva intre reviziile 6 si 5 | Cod sursa (job #138519)
Cod sursa(job #138519)
#include <cstdio>
#define Nmax 42
#define Mmax 16
#define ll long long
int n, m, r;
ll D[Nmax][Nmax][Mmax];
ll C[Nmax];
void citire()
{
scanf("%d %d %d\n", &n, &m, &r);
}
ll calc(ll N, int K)
{
if (K == 0) return 1;
ll rez = calc(N - 1, K - 1);
rez = rez * N / K;
return rez;
}
void solve()
{
int i, j, k, nr;
ll Comb;
C[1] = 1;
D[0][0][0] = 1;
for (i = 1; i < n; ++i)
{
for (j = 0; j <= n; ++j)
for (k = 0; k < m; ++k)
D[i][j][k] = D[i - 1][j][k];
for (j = 0; j <= n; ++j)
for (nr = 1; j + nr * i <= n; ++nr)
{
if (C[i])
Comb = calc(C[i] + nr - 1, nr);
else
Comb = 0;
for (k = 0; k < m; ++k)
D[i][j + nr * i][(k + nr) % m] += D[i - 1][j][k] * Comb;
}
C[i + 1] = D[i][i][r == 0 ? m - 1 : r - 1];
}
printf("%lld\n", D[n - 1][n - 1][r]);
}
int main()
{
freopen("arbori.in", "r", stdin);
freopen("arbori.out", "w", stdout);
citire();
solve();
return 0;
}