1 条题解

  • 1
    @ 2025-5-21 16:23:05

    结论

    n 个不同的球 放入 m 个相同的盒子(每个盒子至少放 1 个球)的放法数为 第二类斯特林数

    S(n,m)S(n, m)

    第二类斯特林数 S(n,m) S(n, m) 表示将 n 个不同元素划分为 m 个非空子集的方式数。


    方法解析

    1. 递推公式
      第二类斯特林数满足以下递推关系:

      S(n,m)=mS(n1,m)+S(n1,m1)S(n, m) = m \cdot S(n - 1, m) + S(n - 1, m - 1)
      • mS(n1,m) m \cdot S(n - 1, m) :第 n 个球放入已有的 m 个盒子之一。
      • S(n1,m1) S(n - 1, m - 1) :第 n 个球单独放入一个新盒子。
    2. 边界条件
      S(0,0)=1S(0, 0) = 1


    放个代码,注意模数,时间复杂度O(nm)O(nm)

    #include<iostream>
    #include<cstdio>
    
    using namespace std;
    
    long long n,m,S[1003][1003];
    
    int main(){
    	scanf("%lld%lld",&n,&m);
    	S[0][0]=1;
    	for (int i=1;i<=n;i++){
    		for (int j=1;j<=m;j++){
    			S[i][j]=(j*S[i-1][j]%1000000007+S[i-1][j-1])%1000000007;
    		}
    	}
    	printf("%lld",S[n][m]); 
    	
    	return 0;
    } 
    
    
    • 1

    信息

    ID
    229
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    (无)
    递交数
    10
    已通过
    7
    上传者