zoukankan      html  css  js  c++  java
  • Codeforces Round #309 (Div. 2) C. Kyoya and Colored Balls

    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 ibefore 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 ci, the number of balls of the i-th color (1 ≤ ci ≤ 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.

    Sample test(s)
    input
    3
    2
    2
    1
    
    output
    3
    
    input
    4
    1
    2
    3
    4
    
    output
    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

    这道题让我学会了组合数的计算,因为直接用组合数公式会导致结果不准确,如C(100,50)这样,如果用乘一个数除一个数的方法,那么可能会导致不能整除而会发生误差。

    思路:若前i种颜色的方法总数是f(i),那么第i+1种颜色的方法总数是f(i+1)=f(i)*C(sum(i+1)-1,a[i+1]-1),其中sum(i+1)是前i+1种颜色的个数总和。

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    #include<string>
    #include<map>
    #include<algorithm>
    using namespace std;
    #define ll __int64
    #define maxn 1000000007
    int a[1600];
    ll c[1050][1060];
    ll sum;
    
    int main()
    {
    	int n,m,i,j,sum1;
    	for(i=1;i<=1000;i++)c[i][0]=1;
    	
    	for(i=1;i<=1000;i++){
    		for(j=1;j<=i;j++){
    			if(i==j)c[i][j]=1;
    			else if(i>j)
    			c[i][j]=(c[i-1][j]+c[i-1][j-1])%maxn;
    		}
    	}
    	
    	while(scanf("%d",&n)!=EOF)
    	{
    		for(i=1;i<=n;i++){
    			scanf("%d",&a[i]);
    		}
    		sum1=a[1];sum=1;
    		for(i=2;i<=n;i++){
    			sum1+=a[i];
    			//printf("%d %d
    ",a[i]-1,sum1-1);
    			sum=(sum*c[sum1-1][a[i]-1])%maxn;
    			//sum=(sum*f(a[i]-1,sum1-1))%maxn;
    			//printf("%lld
    ",sum);
    		}
    		printf("%I64d
    ",sum);
    	}
    	return 0;
    }


  • 相关阅读:
    WCF-配置
    乡下人生活录——程序员给自己买份保险吧
    Sqlserver表分区
    Oracle通过Navicat导入表数据与机构,数据无法直接查询,需要加双引号的问题
    19.Imagetragick 命令执行漏洞(CVE-2016–3714)
    18.phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613)
    17.[CVE-2017-12615]Tomcat任意文件上传漏洞
    16.Tomcat弱口令 && 后台getshell漏洞
    15.Nginx 解析漏洞复现
    14.Nginx 文件名逻辑漏洞(CVE-2013-4547)
  • 原文地址:https://www.cnblogs.com/herumw/p/9464718.html
Copyright © 2011-2022 走看看