1 条题解

  • 0
    @ 2023-5-26 11:34:25

    in Blog & Problem

    题目大意

    • nn 个球,这些球有 kk 种颜色,颜色 ii 的球有 cic_i 个。

    • 将这些球排序,满足  1i<n\forall\ 1\leq i<n,序列中最后一个颜色 ii 的球出现在序列中最后一个颜色 i+1i+1 的球之前。求合法的排序数量。

    • 1n, k, ci1031\leq n,\ k,\ c_i\leq 10^3

    解题思路

    考虑依次往序列中插入颜色为 11 的球,颜色为 22 的球,以此类推直到颜色为 kk 的球也被插入。

    在颜色 <i<i 的球全都插入序列时,我们要插入颜色为 ii 的球,设

    ni=j=1i1ci.n_i=\sum_{j=1}^{i-1}c_i.

    显然插入完毕后序列中最后一个球必为颜色 ii,那么不妨先将其插入序列的末端。那么剩余 ci1c_i-1 个求要插入到前面 nin_i 个球的 ni+1n_i+1 个缝隙中,等价于用 nin_i 个球将 ci1c_i-1 个球隔开,由插板法易得有 (ni+ci1ni)\dbinom{n_i+c_i-1}{n_i} 种方法。

    故最终方法数为

    i=1k(ni+ci1ni).\prod_{i=1}^k\dbinom{n_i+c_i-1}{n_i}.

    时间复杂度 Θ(n2)\Theta(n^2)(用于初始化组合数)。

    AC 代码

    #include<bits/stdc++.h>
    using namespace std;
    const int mod=1e9+7;
    
    int C[1001][1001];
    
    long long answer=1;
    int n,k;
    
    int main(){
    	for(int i=0;i<=1000;i++){
    		C[i][0]=1;
    		for(int j=1;j<=i;j++)
    			C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
    	}
    	scanf("%d",&k);
    	for(int i=1;i<=k;i++){
    		int c;
    		scanf("%d",&c);
    		answer*=C[c+n-1][n];
    		n+=c,answer%=mod;
    	}
    	printf("%lld\n",answer);
    	return 0;
    }
    
    • 1

    信息

    ID
    4725
    时间
    2000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    1
    已通过
    1
    上传者