hdu 2049 考新郎

题解:

  此题属于递推题,和hdu2048思路是一样的,不同的是先将不用跪搓板的新郎挑出,有B = n! / ((n-m)! * m!)个,再将跪搓板的新郎A = A[m](这与hdu2048算法一样)个。总的个数为A*B个。同样要记得用 __int64 开数组A[], B[]。

  代码如下:

#include <stdio.h>

__int64 fact(int n)
{
	if (n <= 1)
		return 1;
	else
		return n*fact(n-1);
}

int main()
{
	int i, n, m, C;
	__int64 A[21] = {0, 0, 1},
			B[21] = {0, 0, 1};
	for (i=3; i<21; i++)
	{//如果有i个跪搓板的新郎,这些新郎有A[i]种选择
		B[i] = A[i-2] + (i-2) * B[i-1];
		A[i] = (i-1) * B[i];
	} 
	for (i=0; i<21; i++)
		B[i] = fact(i);//存起来待用
	scanf("%d", &C);
	for (i=0; i<C; i++)
	{
		scanf("%d%d", &n, &m);
		printf("%I64d\n", B[n]/(B[n-m]*B[m])*A[m]);//不知道这里算不算个技巧,反正比直接调用fact()函数快得多
	}
	return 0;
}


 


做2048用了将近半小时,做这个4、5分钟就搞定了。虽然简单,但是成就感十足,我喜欢~~~~~~

posted on 2013-01-21 10:35  zm001  阅读(167)  评论(0编辑  收藏  举报