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
原文地址:https://www.cnblogs.com/xin-hua/p/3203519.html