斯特林数

一个经典的组合数学问题。求解方法:递推。

第一类斯特林数:n个数摆成m个环,有多少种方法?数各不相同。

s[i][j]表示i个数摆成j个环  的方法数目。

递推:1,摆第n+1个数时,如果前n个数摆成了m个环,那么要在环中插入一个数,总数目是s[n][m]*n;

   2,如果前n个数摆成了m-1个环,方法数目是s[n][m-1].

    综上:s[n+1][m]=s[n][m]*n+s[n][m-1].

这个过程和组合数公式:C[n][m]=C[n-1][n-1]+C[n-1][n]   类似。

第二类斯特林数:经典问题,n个不同的球放到m个相同的盒子里,每个盒子不为空。

和第一类很相似。

递推:1,放第n+1个球时,如果前n个球已经把m个盒子都填了,那么这个球有m中放法,S[n][m]*m;

   2,如果前n个球只把n-1个盒子填了,那么这个球只有一种放法,S[n][m-1]*1.

HDU3625问题:有n个房间和n个对应的钥匙,每个房间放着一把钥匙,侦探要侦破案件,调查所有房间,他只能破门而入,1号房间的客人比较尊贵,不能破开1号门,给定数k,要求最多只能破开k个门,求侦探成功的概率。

  开一个门就能开成环的所有门,破门次数对应环的个数,s[n][i];第一个房间不能破门进入,看作1号门自成一环,无法完成的情况就是s[n-1][i-1]种。

  能进入的总情况数目:Σi~k  s[n][i]-s[n-1][i-1]

  所有情况数目和:n!

  做除法

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=25;
 4 typedef unsigned long long ull;
 5 ull s[maxn][maxn];
 6 void init()
 7 {
 8     s[0][0]=1;
 9     for(int i=1;i<maxn;i++)
10         s[i][0]=0;
11     for(int i=1;i<21;i++)
12         for(int j=1;j<=i;j++)
13             s[i][j]=s[i-1][j]*(i-1)+s[i-1][j-1];
14 }
15 int main()
16 {
17     init();
18     int t,k,n;
19     cin>>t;
20     while(t--)
21     {
22         cin>>n>>k;
23         double fin=0;
24         for(int i=1;i<=k;i++)
25             fin=fin+s[n][i]-s[n-1][i-1];
26         for(int i=1;i<=n;i++)
27             fin/=i;
28         printf("%.4f\n",fin);
29     }
30     return 0;
31 }

时间: 2024-11-06 23:52:18

斯特林数的相关文章

HDU3625(SummerTrainingDay05-N 第一类斯特林数)

Examining the Rooms Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1661    Accepted Submission(s): 1015 Problem Description A murder happened in the hotel. As the best detective in the town, yo

Gym 101147G 第二类斯特林数

大致题意: n个孩子,k场比赛,每个孩子至少参加一场比赛,且每场比赛只能由一个孩子参加.问有多少种分配方式. 分析: k>n,就无法分配了. k<=n.把n分成k堆的方案数乘以n的阶乘.N分成k堆得方案数即第二类斯特林数 http://blog.csdn.net/acdreamers/article/details/8521134 #include <bits/stdc++.h> using namespace std; typedef long long ll; const ll

hdu 4041 2011北京赛区网络赛F 组合数+斯特林数 ***

插板法基础知识 斯特林数见百科 1 #include<iostream> 2 #include<cmath> 3 #include<cstdio> 4 #include<cstring> 5 #define LL long long 6 #define eps 1e-7 7 #define MOD 1000000007 8 using namespace std; 9 int c[2001][2001]={1},stir2[1005][1005]={1};

hdu 3625 第一类斯特林数

题目链接:click here Examining the Rooms Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1146    Accepted Submission(s): 689 Problem Description A murder happened in the hotel. As the best detective

Light OJ 1236 Race 第二类斯特林数

第二类斯特林数 n 匹马 分成1 2 3... n组 每一组就是相同排名 没有先后 然后组与组之间是有顺序的 在乘以组数的阶乘 #include <cstdio> #include <cstring> using namespace std; int dp[1010][1010]; int a[1010]; int main() { a[0] = 1; dp[0][0] = 1; for(int i = 1; i <= 1000; i++) { dp[i][0] = 0; d

HDU 4045 Machine scheduling (组合数学-斯特林数,组合数学-排列组合)

Machine scheduling Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1000    Accepted Submission(s): 363 Problem Description A Baidu's engineer needs to analyze and process large amount of data o

poj 3088 斯特林数

第一类Stirling数是有正负的,其绝对值是个元素的项目分作个环排列的方法数目.常用的表示方法有. 换个较生活化的说法,就是有个人分成组,每组内再按特定顺序围圈的分组方法的数目.例如: {A,B},{C,D} {A,C},{B,D} {A,D},{B,C} {A},{B,C,D} {A},{B,D,C} {B},{A,C,D} {B},{A,D,C} {C},{A,B,D} {C},{A,D,B} {D},{A,B,C} {D},{A,C,B} 给定,有递归关系 ===============

HDU 4372 Count the Buildings(组合数学-斯特林数,组合数学-排列组合)

Count the Buildings Problem Description There are N buildings standing in a straight line in the City, numbered from 1 to N. The heights of all the buildings are distinct and between 1 and N. You can see F buildings when you standing in front of the

swjtu oj Paint Box 第二类斯特林数

http://swjtuoj.cn/problem/2382/ 题目的难点在于,用k种颜色,去染n个盒子,并且一定要用完这k种颜色,并且相邻的格子不能有相同的颜色, 打了个表发现,这个数是s(n, k) * k! s(n, k)表示求第二类斯特林数. 那么关键是怎么快速求第二类斯特林数. 这里提供一种O(k)的算法. 第二类斯特林数: #include <cstdio> #include <cstdlib> #include <cstring> #include <

HDU 1018 Big Number 斯特林数近似n!

题目链接:点击打开链接 斯特林数:点击打开链接 题意是计算n! 的位数 即ans = log10(n!) = log10(sqrt(2πn)) + n*log10(n/e) #include <stdio.h> #include <iostream> #include <algorithm> #include <sstream> #include <stdlib.h> #include <string.h> #include <