HDU2049 不容易系列之(4)——考新郎

排列组合 + 递推

先从n个人里面挑选m个人出来让他们找错新娘,这一共是有C(m,n)种情况

m个人找错新娘就是错排的问题,错了N多次,看了别人的思路才知道是这么回事,看来要当一个模型来记住了。

我们先让第一个新郎过来找,他找错一共有n-1中情况。

接着让第二个新郎过来找,他找错的情况分为两种:

1.他一定找到第一个新娘

2.他不找第一个新娘

对于第一种情况,有3,4,……,n  n-2个新郎新娘错排。

对于第二种情况,有2,3,……,n n-1个新郎新娘错排。

所以m个人错排的情况共有(m-1)(f[m-1]+f[m-2])种

#include <stdio.h>

long long fact(int n) {
    long long temp = 1;
    int i;
    for (i = 1; i <= n; ++ i)
        temp *= i;
    return temp;
}

int
main(int argc, char **argv) {
    long long res[21];
    int i, n, m;
    res[1] = 0;
    res[2] = 1;
    for (i = 3; i < 21; ++ i) {
        res[i] = (i - 1) * res[i - 1] + (i - 1) * res[i - 2];
    }
    int ncase;
    scanf("%d", &ncase);
    while (ncase--) {
        scanf("%d%d", &n, &m);
        printf("%lld\n", fact(n)/(fact(n - m) * fact(m)) * res[m]);
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值