zoukankan      html  css  js  c++  java
  • Codeforces A. Kyoya and Colored Balls(分步组合)

    题目描述:

    Kyoya and Colored Balls

    time limit per test

    2 seconds

    memory limit per test

    256 megabytes

    input

    standard input

    output

    standard output

    Kyoya Ootori has a bag with n colored balls that are colored with k different colors. The colors are labeled from 1 to k. Balls of the same color are indistinguishable. He draws balls from the bag one by one until the bag is empty. He noticed that he drew the last ball of color i before drawing the last ball of color i + 1 for all i from 1 to k - 1. Now he wonders how many different ways this can happen.

    Input

    The first line of input will have one integer k (1 ≤ k ≤ 1000) the number of colors.

    Then, k lines will follow. The i-th line will contain (c_i), the number of balls of the i-th color (1 ≤ (c_i) ≤ 1000).

    The total number of balls doesn't exceed 1000.

    Output

    A single integer, the number of ways that Kyoya can draw the balls from the bag as described in the statement, modulo 1 000 000 007.

    Examples

    Input

    Copy

    3
    2
    2
    1
    

    Output

    Copy

    3
    

    Input

    Copy

    4
    1
    2
    3
    4
    

    Output

    Copy

    1680
    

    Note

    In the first sample, we have 2 balls of color 1, 2 balls of color 2, and 1 ball of color 3. The three ways for Kyoya are:

    1 2 1 2 3
    1 1 2 2 3
    2 1 1 2 3
    

    思路:

    题目是说给一组有颜色的球,从袋子中去出球要求第i种颜色的求必须在第i+1种颜色的求取完之前取完,问这种取球方法有多少种。大致可以看出这是一道排列组合题,而且方案会很多(因为要取模)。一开始想的是整体怎么放,就是说我一下子就要先扣下每种颜色的一个球,固定住他们的顺序,然后在看其他的球的放法。但情况实际上十分复杂。然后想的是这是一种有重复元素的定序排列问题,但直接套公式好像又不可行。应该要分步考虑而不是全局考虑。考虑最后一个位子,肯定放最后一种颜色的球,之前的位置有(sum-1)个,剩余的最后颜色球放在这些位子上有(C_{sum-1}^{a[last]-1})种放法(同种颜色的球无差别)。然后考虑倒数第二种颜色的最后一个球,这是忽略掉前面放好的球,只看空位,最后一个空位放一个球,其它空位放剩余倒数第二种颜色的球,有(C_{sum-a[last]-1}^{a[last-1]-1})种放法。以此类推直到第一种颜色的球。

    注意在实现组合数时用到了费马小定理求逆元来算组合数取模。

    代码

    #include <iostream>
    #define max_n 1005
    #define mod 1000000007
    using namespace std;
    int n;
    long long a[max_n];
    long long ans = 1;
    long long sum = 0;
    long long q_mod(long long a,long long b)
    {
        long long res = 1;
        while(b)
        {
            if(b&1)
            {
                res = ((res%mod)*a)%mod;
            }
            a = (a*a)%mod;
            b >>= 1;
        }
        return res;
    }
    long long fac[max_n];
    void ini()
    {
        fac[0] = 1;
        for(int i = 1;i<max_n;i++)
        {
            fac[i] = ((fac[i-1]%mod)*i)%mod;
        }
    }
    long long inv(long long a)
    {
        return q_mod(a,mod-2);
    }
    long long comb(int n,int k)
    {
        if(k>n) return 0;
        return (fac[n]*inv(fac[k])%mod*inv(fac[n-k])%mod)%mod;
    }
    int main()
    {
        ini();
        //cout << comb(3,1) << endl;
        cin >> n;
        for(int i = 0;i<n;i++)
        {
            cin >> a[i];
            sum += a[i];
        }
        for(int i = n-1;i>=0;i--)
        {
            ans = (ans%mod*(comb(sum-1,a[i]-1)%mod))%mod;
            sum -= a[i];
        }
        cout << ans << endl;
        return 0;
    }
    
    

    参考文章:

    hellohelloC,CodeForces 553A Kyoya and Colored Balls (排列组合),https://blog.csdn.net/hellohelloc/article/details/47811913

  • 相关阅读:
    web安全:防止浏览器记住或自动填写用户名和密码(表单)的解决方案
    Sql CLR创建一个简单的表值函数
    html中实现某区域内右键自定义菜单
    HTML5单页框架View.js介绍
    Java使用apache的开源数据处理框架commons-dbutils完成查询结果集的各种处理输出(8种方式)
    【EAS】【BOS】如果使用BOS开发工具连接远程应用服务进行调试
    VSFTPD 550 Delete operation failed.
    两款不错的js甘特图控件
    我的node-webkit笔记
    node-webkit,nwjs 系统托盘【Tray】实践
  • 原文地址:https://www.cnblogs.com/zhanhonhao/p/11337000.html
Copyright © 2011-2022 走看看