第二类斯特林数:将n个不同元素分成m个集合(n个不同的小球放进m个相同的盒子的方案数)
将n个元素的集合定义m个等价类的数目记做S(n,m)S(n,m)即第二类Stirling数。
s[n][m]=s[n-1][m-1]+m*s[n-1][m]
考虑第n个元素:新开辟一个集合,或者进入已经开辟的集合
例题:luoguP3904 三只小猪
#include <bits/stdc++.h>
using namespace std;
#define N 100
int n,m,a[N][N][N];
void add(int x,int y){
a[x][y][0]=max(a[x-1][y-1][0],a[x-1][y][0]);//!!!!!
for(int i=1;i<=a[x][y][0];i++){
a[x][y][i]+=a[x-1][y-1][i];
a[x][y][i]+=y*a[x-1][y][i];
a[x][y][i+1]+=a[x][y][i]/10;
a[x][y][i]%=10;
}
while(a[x][y][a[x][y][0]+1]){
a[x][y][0]++;
a[x][y][a[x][y][0]+1]+=a[x][y][a[x][y][0]]/10;
a[x][y][a[x][y][0]]%=10;
}
}
int main(){
scanf("%d%d",&n,&m);
a[1][1][1]=1;
a[1][1][0]=1;
for(int i=2;i<=n;i++)
for(int j=1;j<=i;j++)
add(i,j);
if(!a[n][m][0]) printf("0");
for(int i=a[n][m][0];i>=1;i--)
printf("%d",a[n][m][i]);
return 0;
}
高精度的写法:注意长度一开始一定要更新!如果到最后更新,中间有一位为0时会退出。