1 条题解

  • 0
    @ 2026-8-11 22:24:25

    思路

    因为每个盒子中,最大的那颗糖必须放在该盒子的第一个位置。
    所以,若一个盒子有 ss 颗糖,则内部排列方式为 (s1)!(s-1)! 种。

    我们定义 fi,jf_{i,j} 表示 ii 个糖果,jj 个盒子的方案数。
    那么,第 ii 颗糖可以单独成盒,也可以插入前面 i1i-1 个位置之一。
    所以,状态转移方程为:

    fi,j=fi1,j1+(i1)×fi1,jf_{i,j} = f_{i-1,j-1} + (i-1) \times f_{i-1,j}

    :::success[代码]{open}

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    const int mod=1e9+7;
    int n,k,dp[5005][5005];
    signed main(){
    	cin >> n >> k;
    	dp[0][0]=1;
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=min(i, k);j++){
    			dp[i][j]=(dp[i-1][j-1]+(i-1)*dp[i-1][j])%mod;
    		}
    	}
    	cout << dp[n][k];
    	return 0;
    }
    

    :::

    • 1

    信息

    ID
    12625
    时间
    1000ms
    内存
    512MiB
    难度
    4
    标签
    递交数
    27
    已通过
    16
    上传者