1 #include <cstdio>
2 #include <cstdlib>
3 #include "util.h"
4 
5 using namespace std;
6 
stirling(int n,int m)7 double stirling(int n, int m)
8 {
9   double **s, temp;
10   int i, j;
11 
12   if(n < m)
13     return 0.0;
14   else if(n == m)
15     return 1.0;
16   else if(m == 0 && n > 0)
17     return 0.0;
18   else if(m == 1 && n > 0)
19     return 1.0;
20 
21   s = new double *[m];
22 
23   for(i=0; i<m; i++)
24     s[i] = new double[n-m+1];
25 
26   for(j=0; j<=n-m; j++)
27     s[0][j] = 1.0;
28 
29   for(i=1; i<m; i++)
30   {
31     s[i][0] = 1.0;
32     for(j=1; j<=n-m; j++)
33       s[i][j] = (i+1)*s[i][j-1] + s[i-1][j];
34   }
35 
36   temp = s[m-1][n-m];
37 
38   for(i=0; i<m; i++)
39     delete [] s[i];
40 
41   return temp;
42 }
43 
44 
45 #if 0
46 int main(int argc, char *argv[])
47 {
48   int n, m;
49 
50   n = atoi(argv[1]);
51   m = atoi(argv[2]);
52 
53   printf("S(%d,%d) = %f\n", n, m, stirling(n,m));
54 
55   return 0;
56 }
57 #endif
58 
59