http://acm.hust.edu.cn/vjudge/contest/view.action?cid=31329#problem/N
#include<map> #include<set> #include<list> #include<cmath> #include<ctime> #include<deque> #include<stack> #include<bitset> #include<cstdio> #include<vector> #include<cstdlib> #include<cstring> #include<iomanip> #include<numeric> #include<sstream> #include<utility> #include<iostream> #include<algorithm> #include<functional> using namespace std ; int n , k , m ; const int maxn = 55 ; long long f[ maxn ][ maxn ] ; int main() { while( scanf( "%d%d%d" , &n , &k , &m ) != EOF ) { memset( f , 0 , sizeof( f ) ) ; for( int i = 0 ; i <= n && i <= m ; ++i ) { f[ 1 ][ i ] = 1 ; } for( int i = 2 ; i <= k ; ++i ) { for( int j = i ; j <= n ; ++j ) { for( int k = 1 ; k <= m && j - k > 0 ; ++k ) { f[ i ][ j ] += f[ i - 1][ j - k ] ; } } } printf( "%lld " , f[ k ][ n ] ) ; } return 0 ; }