第二类斯特林数模板(高精度)

第二类斯特林数:将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时会退出。

猜你喜欢

转载自blog.csdn.net/weixin_42754727/article/details/88344303