Buy the Ticket

来源:互联网 发布:qq空间怎么做淘宝客 编辑:程序博客网 时间:2024/04/27 22:51
( C(m+n, n) - C(m+n, m+1) ) * m! * n! 化简即 (m+n)! * (m-n+1/ (m+1)

推导过程如下 :

m个人拿50,n个人拿100 

1:    所以如果 n > m,那么排序方法数为 0 这一点很容易想清楚 

2:    现在我们假设 拿50的人用 ‘0’表示, 拿100的人用 1 表示。

      如果有这么一个序列 
0101101001001111

      当第K个位置出现1的个数多余0的个数时就是一个不合法序列了
 
      假设m
=4 n=3的一个序列是:0110100 显然,它不合法, 现在我们把它稍微变化一下: 

      把第二个1(这个1前面的都是合法的)后面的所有位0变成1,1变成0 

      就得到 
0111011 这个序列1的数量多于0的数量, 显然不合法, 但现在的关键不是看这个序列是不是合法的 

      关键是:它和我们的不合法序列 
0110100 成一一对应的关系 

      也就是说任意一个不合法序列(m个0,n个1), 都可以由另外一个序列(n
-1个0和m+1个1)得到 

      另外我们知道,一个序列要么是合法的,要么是不合法的 

      所以,合法序列数量 
= 序列总数量 - 不合法序列的总量 

      序列总数可以这样计算m
+n 个位置中, 选择 n 个位置出来填上 1, 所以是 C(m+n, n) 

      不合法序列的数量就是: m
+n 个位置中, 选择 m+1 个位置出来填上 1 所以是 C(m+n, m+1

      然后每个人都是不一样的,所以需要全排列 m
! * n! 
      
     所以最后的公式为 :  ( C(m+n, n) - C(m+n, m+1) ) * m! * n! 化简即 (m+n)! * (m-n+1) / (m+1)

推广:
      如果原来有p张50元的话,那么不合法的序列的数量应该是:任意一个不合法序列(m个0,n个1),
 
      都可以由另外一个序列(n
-1个0和m+1+p个1)得到,所以是m+n 个位置中, 选择 m+1+p 个位置

      出来填上 1 所以是 C(m+n, m+1+p) 接下来的化简就不推了.

import java.math.*;import java.util.Scanner;public class Main {public static void main(String[] args){BigDecimal[] a=new BigDecimal[203];a[1]=new BigDecimal("1");for(int i=2;i<201;i++){a[i]=a[i-1].multiply(new BigDecimal(i));}Scanner cin=new Scanner (System.in);int n,m,tt=0;while(cin.hasNext()){m=cin.nextInt();n=cin.nextInt();if(m+n==0) {break;}System.out.println("Test #"+(++tt)+":");System.out.println( a[n+m].multiply(new BigDecimal(m-n+1)).divide(new BigDecimal(m+1)).toString());}}}



0 0
原创粉丝点击