两类strling数

来源:互联网 发布:黄金利多利空数据软件 编辑:程序博客网 时间:2024/05/29 19:25

strling数在参加的好几次比赛中都能遇到,就来总结一下
第一类strling数:
我们一般遇到的都是第一类无符号数,也就是求i个不同元素构成j个圆排列的方案数
其递推式是:
s(i, j) = s(i - 1, j - 1) + (i - 1) * s(i - 1, j) , 1 <= j <= i - 1
其中S(i, 0) = 0; i >= 1;
S(i, i) = 1; i >= 0;
理解起来就是i个数构成j个环=i-1个数构成一个环和一个元素自成环+i-1个元素构成j个环然后在每个元素旁边加上一个元素

#include<bits/stdc++.h>using namespace std;using LL=int64_t;const int INF=0x3f3f3f3f;const int maxn=1e3;LL Strling1[maxn][maxn];void strling() {    memset(Strling1,0,sizeof(Strling1));    Strling1[0][0]=1;    for(int i=1;i<maxn;i++) {        Strling1[i][0]=0,Strling1[i][i]=1;        for(int j=1;j<i;j++) {            Strling1[i][j]=Strling1[i-1][j-1]+(i-1)*Strling1[i-1][j];        }    }}

第二类strling数:
将i个不同的元素拆分成j个集合的方案数,其中比如说将两个数分成(3,5)和分成(5,3)视为同一种情况
其递推式是:s(i,j)=j*s(i-1,j)+s(i-1,j-1)
其中s(i,0)=0,s(i,i)=1;

#include<bits/stdc++.h>using namespace std;using LL=int64_t;const int INF=0x3f3f3f3f;const int maxn=1e3;LL Strling2[maxn][maxn];void strling() {    memset(Strling2,0,sizeof(Strling2));    Strling2[0][0]=1;    for(int i=1;i<maxn;i++) {        Strling2[i][0]=0,Strling2[i][i]=1;        for(int j=1;j<i;j++) {            Strling2[i][j]=Strling2[i-1][j-1]+j*Strling2[i-1][j];        }    }}
原创粉丝点击