hdu 1133 Buy the Ticket

首先,记50的为0,100的为1.

当m=4,n=3时,其中的非法序列有0110010;

从不合法的1后面开始,0->1,1->0,得到序列式0111101

也就是说,非法序列变为了n-1个0,m+1个1.

总的数目=C(m+n,n),非法的=C(m+n,m+1)

符合数目=(C(m+n,n)-C(m+n,m+1))*m!*n!;

化简得:(m+n)!*(m+1-n)/(m+1).

Java代码:

 

 1 import java.io.*;  2 import java.math.*;  3 import java.math.BigInteger;  4 import java.lang.String.*;  5 import java.util.*;  6 public class Main  7 {  8     public static BigInteger [] p;  9     public static void main(String arg[]) 10  { 11         int i; 12         p = new BigInteger[201]; 13         p[0]=BigInteger.valueOf(1); 14         for(i=1;i<=200;i++) 15             p[i]=p[i-1].multiply(BigInteger.valueOf(i)); 16         Scanner cin = new Scanner(System.in); 17         int k=1; 18         while(true) 19  { 20             int m = cin.nextInt(); 21             int n = cin.nextInt(); 22             if(m==0&&n==0) break; System.out.println("Test #"+k+++":"); 23             if(m<n) 24                 System.out.println("0"); 25             else

26                 System.out.println(p[m+n].multiply(BigInteger.valueOf(m+1-n)).divide(BigInteger.valueOf(m+1)).toString()); 27  } 28  } 29 }
View Code

 

 

 

你可能感兴趣的:(HDU)