hdu - 2512 一卡通大冒险 (斯特灵数 && 贝尔数)

http://acm.hdu.edu.cn/showproblem.php?pid=2512    

/**  
题意:给你k张不同的卡放到n本书里有多少种放法?(n是无限大)
典型的 斯特灵数第二类 +贝尔数 
斯特灵数:如:给你k张牌放到n个无标号的盘子里(盘子不能为空)问你有多少种方法;
Stirling[i][j] = Stirling[i-1][j-1] + j * Stirling[i-1][j] 
表示前i张牌放到j个盘子里的方法数可以由前i-1张牌放到j-1个盘子里的方法数(相当于在其后加一张牌一个盘子) + 前i-1张牌放到j个盘子里(再加一张牌可以放到j个盘子里) * j ;
贝尔数:就是斯特灵数的和(即所求值)
**/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int Stirling[20005][20005];
int Bell[2005];
void init(){

    for(int i = 1;i <= 2000;i++)//斯特灵数
    {
        Stirling[i][i] = 1;
        for(int j = 1;j < i;j++){
            Stirling[i][j] = (Stirling[i-1][j-1] + Stirling[i-1][j] * j)%1000;
        }
    }
    for(int i = 1;i <= 2000;i++)//贝尔数
    {
        for(int j = 1;j <= i;j++)
            Bell[i] = (Bell[i] + Stirling[i][j]) % 1000;
    }
}
int main(){
    init();
    int t;
    cin >> t;
    int n;
    while(t--){
        cin >>  n;
        cout << Bell[n] << endl;
    }
}






斯特灵数第一类:

第一类:n个元素分成k个非空循环排列(环)的方法总数

递推式:s(n+1,k)=s(n,k-1)+n*s(n,k)

解释:考虑第n+1个元素 1、单独形成循环排列,剩下的有s(n,k-1)种方法 2、和别的元素一起形成循环排列,n个元素形成循环排列的方法数是s(n,k),第n+1个可以放在第i个元素左边,共有n种放法,一共是n*s(n,k);

code : 如第二类相似

转: http://www.cnblogs.com/xiaohongmao/p/3645517.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值