HDUOJ:【5】不容易系列之(4)——考新郎

原题目:

http://acm.hdu.edu.cn/showproblem.php?pid=2049

主要思路: 

这个问题主要是一个组合和错排相结合的问题:

  1. 一共N对夫妻,选出M个是进行错排的,是一个组合问题.
  2. 对M对进行错排,利用错排迭代公式:

D(n) = (n-1) [D(n-2) + D(n-1)],其中D(1) = 0, D(2) = 1.

源代码:

#include <iostream>
using namespace std;
unsigned long long int stairs(unsigned long long int X)
{
	if(X == 0)
	{
		return 1;
	}
	unsigned long long int i = 1;
	unsigned long long int result = 1;
	for(i = 1; i <= X; i++)
	{
		result *= i;
	}
	return result;
} 

int main()
{
	unsigned long long int x;
	int c;
	int n[1000];
	int m[1000];
	unsigned long long int result[1000];
	unsigned long long int cuo[21];
	cuo[1] = 0;
	cuo[2] = 1;
	for(int i = 3; i <= 20; i++)
	{
		cuo[i] = (i-1)*(cuo[i-1] + cuo[i-2]);
	}
	
	scanf("%llu",&c);
	for(int i = 0; i < c; i++)
	{
		scanf("%d %d", &n[i], &m[i]);
		n[i] = n[i] - m[i];
		result[i] = (stairs(n[i]+m[i])/(stairs(n[i])*stairs(m[i])))*cuo[m[i]];
	}
	
	for(int i = 0; i < c; i++)
	{
		printf("%llu\n",result[i]);
	}
	return 0;
}
发布了6 篇原创文章 · 获赞 0 · 访问量 127

猜你喜欢

转载自blog.csdn.net/Alex497259/article/details/104057207