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

这个道题就是求N中有多少中M个数的错排。

因此先找到N个新郎中M个错一共有几种,显然是CMN=N!/(M!*(N-M)!)。即CMN=N!/M!/(N-M)!。

然后在求出M个数的错排个数,递推关系:f[n]=(n-1)*(f[n-1]+f[n-2])

#include <cstdio>

long long int m[30];

long long int C(int n, int m)
{
	long long int sum = 1, j = 1;
	for(int i = n; i >= n - m + 1; -- i)
	{
		sum = sum * i / j;
		j ++;
	}
	return sum;
}

long long int f(int n)
{
	m[2] = 1;
	m[3] = 2;
	
	for(int i = 4; i <= n; ++ i)
	{
		m[i] = (i - 1) * (m[i - 1] + m[i - 2]);
	}
	
	return m[n];
}

int main()
{
	int c, n, m;
	scanf("%d", &c);
	while(c --)
	{
		scanf("%d %d", &n, &m);
		printf("%lld\n", C(n, m) * f(m));
	}
	
	return 0;
}

  

posted @ 2019-08-02 19:28  青衫客36  阅读(197)  评论(0编辑  收藏  举报