poj 3088 斯特林数

第一类Stirling数是有正负的,其绝对值是n个元素的项目分作k个环排列的方法数目。常用的表示方法有s(n,k) , \left[\begin{matrix} n \\ k \end{matrix}\right]

换个较生活化的说法,就是有n个人分成k组,每组内再按特定顺序围圈的分组方法的数目。例如s(4,2)=11

  1. {A,B},{C,D}
  2. {A,C},{B,D}
  3. {A,D},{B,C}
  4. {A},{B,C,D}
  5. {A},{B,D,C}
  6. {B},{A,C,D}
  7. {B},{A,D,C}
  8. {C},{A,B,D}
  9. {C},{A,D,B}
  10. {D},{A,B,C}
  11. {D},{A,C,B}

给定s(n,0)=0,s(1,1)=1,有递归关系s(n,k)=s(n-1,k-1) + (n-1) s(n-1,k)

======================================================================================================================================================

第二类Stirling数是n个元素的集定义k个等价类的方法数目。常用的表示方法有S(n,k) , S_n^{(k)} ,  \left\{\begin{matrix} n \\ k \end{matrix}\right\}

换个较生活化的说法,就是有n个人分成k组的分组方法的数目。例如有甲、乙、丙、丁四人,若所有人分成1组,只能所有人在同一组,因此S(4,1)=1;若所有人分成4组,只能每人独立一组,因此S(4,4)=1;若分成2组,可以是甲乙一组、丙丁一组,或甲丙一组、乙丁一组,或甲丁一组、乙丙一组,或其中三人同一组另一人独立一组,即是:

  1. {A,B},{C,D}
  2. {A,C},{B,D}
  3. {A,D},{B,C}
  4. {A},{B,C,D}
  5. {B},{A,C,D}
  6. {C},{A,B,D}
  7. {D},{A,B,C}

因此S(4,2)=7

 

给定S(n,n)=S(n,1)=1,有递归关系S(n,k) = S(n-1,k-1) + k S(n-1,k)

======================================================================================================================================================

poj 3088 题意: 给一串数字1、2、...、B,求这些数字分组的情况数,{(1),(2)} {(2),(1)} 算两种不同的情况

解法:赤裸裸的第二类斯特林数

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
long long c[15][15] , s[15][15] ,f[15];
void dabiao()
{
    c[0][0]=1,f[1]=f[0]=1,s[1][1]=1;
    for(int i=1; i<=11;i++){
        f[i]=f[i-1]*i;
        c[i][0]=1 ,c[i][1] = i;
        s[i][1]=1,s[i][i]=1,s[i][0]=0;
        for(int j=2;j<=11;j++){
            c[i][j] = c[i-1][j-1]+c[i-1][j] ;
            s[i][j]=s[i-1][j-1]+j*s[i-1][j] ;
        }
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    dabiao();
    int ncase =1;
    while(t--){
        int n;
        long long ans= 0;
        scanf("%d", &n) ;
        for(int i=1;i<=n;i++){

            for(int j=1;j<=i;j++){
                ans+=c[n][i]*s[i][j]*f[j] ;
            }
        }
        printf("%d %d %lld\n",ncase++,n,ans) ;
    }
    return 0;
}

 

posted @ 2015-08-08 00:58  Scale_the_heights  阅读(338)  评论(0编辑  收藏  举报