第二类Stirling数初探 By cellur925

上午noi.ac崩崩崩了,栽在组合数学上,虽说最后在辰哥&Chemist的指导下A掉了此题,也发现自己组合数学太弱了qwq。

在luogu上找题,结果找到了一个第二类斯特林数的题(还是双倍经验,逃。)

一、什么是第二类Stirling数

第二类斯特林数 S(n,k):把 n 个元素划分成 k 个集合的方案数。 

这个问题说的实际一点,就比如说,有n个互异的小球,把他们放入m个盒子里,盒子里不允许为空的方案数。我们设s(i,j)表示放到i个小球,j个盒子的方案数。

那么对于每个小球,当前我们有两种放法:

  第一种,我们把它放进一个现在盒子里没球的盒子中,这部分是s(i-1,j-1)

  第二种,我们把它放进一个现在盒子里有球的盒子中,因为有j个盒子,所以这部分是  j  *  s (i-1,j)

  那么将二者 加起来就是我们要求的解。

二、丢几道例题跑

LuoguP3904三只小猪  比较裸啦=w=。

 1 #include<cstdio>
 2 #include<algorithm>
 3
 4 using namespace std;
 5 typedef long long ll;
 6
 7 ll n,m;
 8 int len;
 9 int ans[1000];
10 int s[100][100][1000];
11
12 ll lmin(ll a,ll b)
13 {
14     if(a<b) return a;
15     else return b;
16 }
17
18 void bigcalc(int x,int y)
19 {
20     if(y>x) return ;
21     if(x==1&&y==1) return ;
22     int tmp=0;
23     for(int i=1;i<=len;i++) ans[i]=0;
24     len=1;
25     for(int i=1;i<=s[x-1][y][0];i++)
26     {
27         ans[i]=s[x-1][y][i]*y+tmp;
28         tmp=ans[i]/10;
29         ans[i]%=10;
30     }
31     len=s[x-1][y][0];
32     if(tmp) ans[++len]=tmp;
33     s[x][y][0]=1;
34     tmp=0;
35     while(s[x][y][0]<=s[x-1][y-1][0]||s[x][y][0]<=len)
36     {
37         s[x][y][s[x][y][0]]=s[x-1][y-1][s[x][y][0]]+ans[s[x][y][0]]+tmp;
38         tmp=s[x][y][s[x][y][0]]/10;
39         s[x][y][s[x][y][0]]%=10;
40         s[x][y][0]++;
41     }
42     s[x][y][s[x][y][0]]=tmp;
43     if(s[x][y][s[x][y][0]]==0&&s[x][y][0]!=1) s[x][y][0]--;
44 }
45
46 int main()
47 {
48     scanf("%lld%lld",&n,&m);
49     if(n<m) {printf("0");return 0;}
50     if(n==m) {printf("1");return 0;}
51     s[1][1][0]=1;s[1][1][1]=1;
52     for(int i=2;i<=n;i++)
53         for(int j=1;j<=lmin(i,m);j++)
54             bigcalc(i,j);
55     for(int i=s[n][m][0];i>=1;i--)
56         printf("%d",s[n][m][i]);
57     return 0;
58 }

LuoguP1655小朋友的球 上面题的二倍经验

三、一些变体

(来自baidubaike==)

原文地址:https://www.cnblogs.com/nopartyfoucaodong/p/9690393.html

时间: 2024-10-17 12:51:29

第二类Stirling数初探 By cellur925的相关文章

HDU 2643 Rank:第二类Stirling数

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2643 题意: 有n个个选手参赛,问排名有多少种情况(可以并列). 题解: 简化问题: 将n个不同的元素放到i个有差别的盒子中,情况数为P(n,i),求∑P(n,i) (1<=i<=n) 再简化: 将n个不同的元素放到i个无差别的盒子中,情况数为S(n,i),求∑( S(n,i)*i! ) (1<=i<=n) 哇这是第二类Stirling数 ( ̄▽ ̄)~* 递推式:s(n,k) = s(

poj 1671 Rhyme Schemes 第二类Stirling数

题意: 求s(n,0)+s(n,1)+...s(n,n),s(i,j)为第二类Stirling数. 分析: 有递推公式s(p,k)=(p-1)*s(p-1,k)+s(p-1,k-1) ,1<=k<=p-1. 代码: //poj 1671 //sep9 #include<iostream> using namespace std; double s[64][64]; double sum[64]; int main() { for(int i=0;i<=50;++i){ s[i

[组合数学] 第一类,第二类Stirling数,Bell数

一.第二类Stirling数 定理:第二类Stirling数S(p,k)计数的是把p元素集合划分到k个不可区分的盒子里且没有空盒子的划分个数. 证明:元素在拿些盒子并不重要,唯一重要的是各个盒子里装的是什么,而不管哪个盒子装了什么. 递推公式有:S(p,p)=1 (p>=0)         S(p,0)=0  (p>=1)         S(p,k)=k*S(p-1,k)+S(p-1,k-1)   (1<=k<=p-1) .考虑将前p个正整数,1,2,.....p的集合作为要被

[ACM] FZU 1570 集合划分问题( 不同小球放入相同盒子,第二类Stirling数)

Problem Description n个元素的集合{1,2,...,n}可以划分若干个非空子集.例如,当n=4时,集合{1,2,3,4}可以划分为15个不同的非空子集如下: {{1},{2},{3},{4}}, {{1,2},{3},{4}}, {{1,3},{2},{4}}, {{1,4},{2},{3}}, {{2,3},{1},{4}}, {{2,4},{1},{3}}, {{3,4},{1},{2}}, {{1,2},{3,4}}, {{1,3},{2,4}}, {{1,4},{2,

组合计数 &amp;&amp; Stirling数

参考: http://blog.csdn.net/qwb492859377/article/details/50654627 http://blog.csdn.net/acdreamers/article/details/8521134 http://blog.csdn.net/sr_19930829/article/details/40888349 球,盒子都可以分成是否不能区分,和能区分,还能分成是否能有空箱子,所以一共是8种情况,我们现在来一一讨论. 1.球同,盒不同,无空箱 C(n-1,

lightoj1326_第二类Stirling

题目链接http://lightoj.com/volume_showproblem.php?problem=1326 1051 - Good or Bad    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB A string is called bad if it has 3 vowels in a row, or 5 consonants in a row, or both. A strin

Bell(hdu4767+矩阵+中国剩余定理+bell数+Stirling数+欧几里德)

Bell Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 4767 Description What? MMM is learning Combinatorics!? Looks like she is playing with the bell sequence now: bell[n] = number of ways to part

贝尔数(来自维基百科)&amp; Stirling数

贝尔数 贝尔数以埃里克·坦普尔·贝尔(Eric Temple Bell)为名,是组合数学中的一组整数数列,开首是(OEIS的A000110数列): Bell Number Bn是基数为n的集合的划分方法的数目.集合S的一个划分是定义为S的两两不相交的非空子集的族,它们的并是S.例如B3 = 5因为3个元素的集合{a, b, c}有5种不同的划分方法: {{a}, {b}, {c}} {{a}, {b, c}} {{b}, {a, c}} {{c}, {a, b}} {{a, b, c}}; B0

两类Stirling数

转:http://blog.csdn.net/acdreamers/article/details/8521134 第一类Stirling数 s(p,k)    s(p,k)的一个的组合学解释是:将p个物体排成k个非空循环排列的方法数. s(p,k)的递推公式: s(p,k)=(p-1)*s(p-1,k)+s(p-1,k-1) ,1<=k<=p-1 边界条件:s(p,0)=0 ,p>=1  s(p,p)=1  ,p>=0   递推关系的说明: 考虑第p个物品,p可以单独构成一个非空