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分钟就搞定了。虽然简单,但是成就感十足,我喜欢~~~~~~
浙公网安备 33010602011771号