範例程式碼 uva10721
//uva10721
/** 2016.12.13 - lin bi-shiang - uva10721 */
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long LL;
LL dp[55][55][55];
bool vis[55][55][55];
LL solve( int n, int k, int m ) {
if ( k == 1 && n > m ) return 0;
if ( vis[n][k][m] == true )
return dp[n][k][m];
if ( k == 1 ) return 1;
LL cnt = 0;
for ( int i = n-1 ; i >= n-m && i > 0 ; --i ) {
cnt += solve(i,k-1,m);
}
dp[n][k][m] = cnt;
vis[n][k][m] = true;
return dp[n][k][m];
}
int main() {
int n, k, m;
memset(dp,0,sizeof(dp));
memset(vis,false,sizeof(vis));
while( scanf("%d%d%d",&n,&k,&m) == 3 ) {
//memset(dp,0,sizeof(dp));
printf("%lld\n",solve(n,k,m));
}
return 0;
}