首先,记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代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }