两类strling数

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];
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值