斯特林数 HDU 3625

来源:互联网 发布:孙真人知柏地黄丸好吗 编辑:程序博客网 时间:2024/05/21 04:02
/* 斯特林数第一类 n个元素的集合分成k个环排列的方法 s[n][0] = 0; s[1][1] = 1; s[n][k] = s[n-1][k-1]+(n-1)*s[n-1][k]; 当放入第n个元素,n可以为单独的循环排列,当n-1个元素已经占据了k个环排列,n可以插入n-1个元素的左边 该题要去除1号门的单独排列,所以。。。*/#include<cstdio>#include<iostream>using namespace std;typedef long long LL;const int maxn = 25;LL f[maxn];LL st[maxn][maxn];void init() {    f[1]=1;    for (int i=2; i<maxn; i++)        f[i] = i*f[i-1];    for (int i=0; i<maxn; i++)        st[i][0] = 0;    st[1][1] = 1;    for (int i=1; i<maxn; i++) {        for (int j=1; j<=i; j++)            if (i == j)                st[i][j] = 1;            else                st[i][j] = st[i-1][j-1]+(i-1)*st[i-1][j];    }    for (int i=1; i<maxn; i++) {        for (int j=1; j<maxn; j++)            st[i][j] = abs(st[i][j]);    }}int main() {    int T;    scanf("%d", &T);    init();    while (T--) {        int n, k;        scanf("%d%d", &n, &k);        LL sum = 0;        for (int i=1; i<=k; i++)            sum += st[n][i]-st[n-1][i-1];        printf("%.4lf\n",1.0*sum/f[n]);    }    return 0;}
0 0