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