Pagini recente » Cod sursa (job #1628841) | Cod sursa (job #3152779) | Cod sursa (job #1900967) | Cod sursa (job #1646652) | Cod sursa (job #1954943)
#include <cstdio>
#include <vector>
#include <algorithm>
#define ll long long
#define MAXN 90
ll dp[MAXN+1];
std::vector <ll> *d[MAXN+1];
inline ll calc(int n, int m, int k){
for(int i=1; i<=n; i++){
d[i]=new std::vector <ll>[std::min(i, n/2+1)];
for(int j=0; j<std::min(i, n/2+1); j++)
d[i][j].assign(i, 0);
}
dp[1]=1;
d[1][0][0]=1;
for(int i=2; i<=n; i++){
for(int j=1; (j<i)&&(j<=n/2); j++){
for(int p=1; p<i; p++){
ll comb=1;
for(int q=0; (q<=p)&&(j*q<i); q++){
if(i-j*q>p-q)
d[i][j][p]+=d[i-j*q][std::min(j-1, i-j*q-1)][p-q]*comb;
comb*=dp[j]+q;
comb/=q+1;
}
}
}
for(int j=1; j<i; j++)
if((j+1)%m==k)
dp[i]+=d[i][std::min(i-1, n/2)][j];
for(int p=0; p<i; p++)
if((p+2)%m==k)
for(int j=std::min(i-1, n/2)+1; j<i; j++)
if(p<i-j)
dp[i]+=d[i-j][i-j-1][p]*dp[j];
}
ll ans=0;
for(int i=1; i<n; i++)
if(i%m==k)
ans+=d[n][std::min(n-1, n/2)][i];
for(int i=0; i<n; i++)
if((i+1)%m==k)
for(int j=std::min(n-1, n/2)+1; j<n; j++)
if(i<n-j)
ans+=d[n-j][n-j-1][i]*dp[j];
return ans;
}
int main(){
FILE *fin, *fout;
fin=fopen("arbori.in", "r");
fout=fopen("arbori.out", "w");
int n, m, k;
ll ans;
fscanf(fin, "%d%d%d", &n, &m, &k);
if(n==1) ans=1;
else ans=calc(n, m, k);
fprintf(fout, "%lld\n", ans);
fclose(fin);
fclose(fout);
return 0;
}