组合数学,这里我无耻地用了JAVA的大数。。好像有不用大数的解法,但是没想出来。。直接暴力的话关键就是要找出错排组合数的递推公式a[i]=(a[i-1]+a[i-2])*(i-1)
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main
{
static List<BigDecimal> FACT = new ArrayList<BigDecimal>();
static List<BigDecimal> L = new ArrayList<BigDecimal>();
static void init()
{
FACT.add(BigDecimal.ONE);
for (int i = 1; i < 100; i++)
FACT.add(FACT.get(i - 1).multiply(new BigDecimal(i)));
L.add(BigDecimal.ZERO);
L.add(BigDecimal.ZERO);
L.add(BigDecimal.ONE);
for (int i = 3; i < 100; i++)
L.add(L.get(i - 1).add(L.get(i - 2))
.multiply(new BigDecimal(i - 1)));
}
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
init();
while (sc.hasNext())
{
int N = sc.nextInt();
int M = sc.nextInt();
if (N == M)
System.out.println(BigDecimal.ONE.divide(FACT.get(N), 8,
RoundingMode.HALF_UP).toPlainString());
else
System.out.println(L
.get(N - M)
.divide(FACT.get(M).multiply(FACT.get(N - M)), 8,
RoundingMode.HALF_UP).toPlainString());
}
sc.close();
}
}